This error occurs when using strict mode in SQL/JSON path expressions to access a non-existent JSON object member or array element. Switch to lax mode or add error handling clauses to suppress the error.
PostgreSQL SQL/JSON path expressions handle structural errors in two distinct modes. In strict mode, attempting to access a non-existent member of a JSON object or element of an array raises an error. In lax mode (the default), the path engine adapts to the queried data and suppresses structural errors, returning an empty result instead. This error typically occurs when you use strict mode to query a JSON path that does not exist in your data structure, or when using functions like jsonb_path_query() on paths that are not present in the JSON document.
Lax mode (the default) suppresses structural errors and returns empty results. Remove the strict keyword from your path expression:
-- Strict mode (fails if email does not exist)
SELECT jsonb_path_query(data, 'strict $.email');
-- Lax mode (returns empty if email does not exist)
SELECT jsonb_path_query(data, '$.email');The jsonpath operators @? and @@ suppress structural errors automatically:
-- Use @? to check if path exists
SELECT * FROM users WHERE data @? '$.email';
-- Use @@ to filter based on a path condition
SELECT * FROM users WHERE data @@ '$.status == "active"';In strict mode, use ON ERROR to specify fallback behavior:
SELECT jsonb_path_query(
data,
'strict $.email',
silent => true
);
-- Or with explicit value
SELECT jsonb_path_query(
data,
'strict $.email',
silent => true
) AS email;Use -> and ->> operators which return NULL instead of failing:
-- Safe: returns NULL if key does not exist
SELECT data->'email' AS email FROM users;
-- Safe: returns text NULL if key does not exist
SELECT data->>'email' AS email FROM users;
-- Compare with path query
SELECT jsonb_path_query_first(data, '$.email') AS email FROM users;Provide default values when JSON keys may not exist:
-- With COALESCE
SELECT COALESCE(
data->>'email',
data->>'alternate_email',
'[email protected]'
) AS email FROM users;
-- With CASE
SELECT CASE
WHEN data ? 'email' THEN data->>'email'
ELSE 'unknown'
END AS email FROM users;PostgreSQL distinguishes between json and jsonb types. The jsonb type supports more operators including @?, @@, and path functions. If using json type, cast to jsonb with ::jsonb. The silent argument is available in jsonb_path_exists(), jsonb_path_match(), jsonb_path_query(), jsonb_path_query_array(), and jsonb_path_query_first() functions (PostgreSQL 12+). For indexing performance, consider using jsonb_path_ops index operator class if querying with @>, @?, or @@ operators. In lax mode, the path engine will attempt to iterate over any array or object it encounters, making it more forgiving but potentially slower for large structures.
0LP01: invalid_grant_operation
How to fix "Invalid grant operation" (0LP01) in PostgreSQL
aggregate functions are not allowed in WHERE clause
How to fix "aggregate functions are not allowed in WHERE clause" in PostgreSQL
2200L: not_an_xml_document
How to fix "2200L: not_an_xml_document" in PostgreSQL
ERROR: ambiguous_parameter
42P08: Ambiguous parameter error
2201F: invalid_argument_for_power_function
Invalid argument for power function (2201F)