/ / PostgreSQL busca el valor dentro de la matriz JSON - json, postgresql, jsonb

Valor de búsqueda de PostgreSQL dentro de la matriz JSON - json, postgresql, jsonb

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 № 1

Lo 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;