postgres has attribute array python json postgresql psycopg2

python - has - ¿Cómo compruebo si existe una clave json en Postgres?



json to array postgres (3)

Digamos que tengo un json que se parece a esto:

some_json = {''key_a'': {''nested_key'': ''a''}, ''key_b'': {''nested_key'': ''b''}}

Tenga en cuenta que key_a y key_b son claves opcionales asignadas a diccionarios y pueden o no existir.

Tengo una función que verifica si existe una clave externa en some_json y devuelve un valor booleano.

CREATE FUNCTION key_exists(some_json json, outer_key text) RETURNS boolean AS $$ BEGIN RETURN (some_json->outer_key IS NULL); END; $$ LANGUAGE plpgsql;

Obtuve el siguiente error:

ProgrammingError: operator does not exist: json -> boolean

¿Por qué es outer_key equivalente a un booleano? ¿Cuál es la sintaxis adecuada para realizar esta comprobación?


Para verificar si la clave existe o no, puede usar el operador -> esto se usa para obtener el campo Obtener objeto JSON por clave Por ejemplo:

actual json data in column(attribute): { "active": "t", "email_address": "[email protected]", "pin": "2233" } SELECT attributes::json->''email_address'' FROM entity WHERE entity_id = 55;

También puede buscar la tecla a través del operador #> y # >>

Obtenga el campo del objeto JSON como texto: ''{"a": 1, "b": 2}'' :: json - >> ''b'' usando el operador - >>


Su función hace exactamente lo contrario de lo que es el nombre, pero la forma de corregir su función es agregar ( y ) alrededor de la some_json->outer_key .

Aquí está funcionando completamente y coincide con el nombre de su función (observe que NOT delante de NULL ).

CREATE FUNCTION key_exists(some_json json, outer_key text) RETURNS boolean AS $$ BEGIN RETURN (some_json->outer_key) IS NOT NULL; END; $$ LANGUAGE plpgsql;

Algunas pruebas:

select key_exists(''{"key_a": {"nested_key": "a"}, "key_b": {"nested_key": "b"}}''::json, ''key_a''); key_exists ------------ t (1 row)

Y aquí cuando no existe una llave:

select key_exists(''{"key_a": {"nested_key": "a"}, "key_b": {"nested_key": "b"}}''::json, ''test''); key_exists ------------ f (1 row)


También puedes usar el ''?'' operador de esa manera:

SELECT ''{"key_a":1}''::jsonb ? ''key_a''

Y si necesita consultar por clave anidada, use así:

SELECT ''{"key_a": {"nested_key": "a"}}''::jsonb -> ''key_a'' ? ''nested_key''

Consulte http://www.postgresql.org/docs/9.5/static/functions-json.html

NOTA : Solo para tipo jsonb .