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
.