Quiero buscar un elemento dentro de JSONB en PostgreSQL aquí es mi JSON
CREATE TABLE test
AS
SELECT jsondata::jsonb
FROM ( VALUES
( "{"key1": 1, "keyset": [10, 20, 30]}" ),
( "{"key1": 1, "keyset": [10, 20]}" ),
( "{"key1": 1, "keyset": [30]}" ),
( "{"key1": 1 }" ),
( "{"key1": 1, "key2": 1}" )
) AS t(jsondata);
en la tabla de arriba keyset
No existe en todas las filas y mi consulta es
SELECT * FROM test WHERE jsondata->>"keyset" = 10;
La consulta anterior está dando un resultado vacío, y la salida esperada es
jsondata
------------------------------------
{"key1": 1, "keyset": [10, 20, 30]}
{"key1": 1, "keyset": [10, 20]}
Respuestas
2 para la respuesta № 1Lo que quieres es esto
SELECT jsondata @> "{"keyset": [10]}" FROM foo;
Así se ve esto
SELECT jsondata, jsondata @> "{"keyset": [10]}" FROM foo;
jsondata | ?column?
-------------------------------------+----------
{"key1": 1, "keyset": [10, 20, 30]} | t
{"key1": 1, "keyset": [10, 20]} | t
{"key1": 1, "keyset": [30]} | f
{"key1": 1} | f
{"key1": 1, "key2": 1} | f
el @>
El operador verifica la contención en PostgreSQL. Pongo en el select para mostrarte las evaluaciones ..
SELECT jsondata
FROM foo
WHERE jsondata @> "{"keyset": [10]}";
1 para la respuesta № 2
SELECT jsondata
FROM test
JOIN LATERAL jsonb_array_elements_text(jsondata->"keyset") a(v)
ON TRUE
WHERE a.v::integer = 10;