sql - que - Consulta de elemento de matriz en la columna JSON
mongodb español (4)
Recientemente se actualizó a usar PostgreSQL 9.3.1 para aprovechar las funcionalidades JSON. En mi tabla tengo una columna tipo json que tiene una estructura como esta:
{
"id": "123",
"name": "foo",
"emails":[
{
"id": "123",
"address": "somethinghere"
},
{
"id": "456",
"address": "soemthing"
}
]
}
Esto es solo datos ficticios para el propósito de la pregunta.
¿Es posible consultar un elemento específico en el conjunto de correos electrónicos basado en el id?
Más o menos: "devolver el correo electrónico donde id = 123)"?
Con una columna JSONB en Postgres 9.4+, puede usar el operador contains @>
para consultar un elemento en una matriz:
SELECT * FROM jsontest WHERE data @> ''{ "emails": [{ "id": "123" }] }'';
Consulte Consulta de elementos de matriz dentro del tipo JSON para obtener más detalles.
Aquí hay un ejemplo de trabajo:
CREATE TABLE jsontest(data JSONB NOT NULL);
INSERT INTO jsontest VALUES (
''{
"name": "foo",
"id": "123",
"emails":
[
{
"address": "somethinghere",
"id": "123"
},
{
"address": "soemthing",
"id": "456"
}
]
}''
);
SELECT * FROM jsontest WHERE data @> ''{ "emails": [{ "id": "123" }] }'';
data
----
{"id": "123", "name": "foo", "emails": [{"id": "123", "address": "somethinghere"}, {"id": "456", "address": "soemthing"}]}
(1 fila)
Encontré esta publicación y descubrí que puedes consultar directamente en una tabla como esta:
SELECT *
FROM table_name, json_array_elements(json_column) AS data
WHERE data->>''id'' = 123;
Omitiendo esta parte:
json_array_elements(t.json_col->''emails'')
Puedes hacerlo tan simple como:
SELECT * FROM table WHERE emails->>''id'' = ''123'';
parece que guardas el ID como una cadena; si fuera un número entero, puedes hacerlo así:
SELECT * from table WHERE cast(emails->>''id'' as integer ) = 123 ;
o puede obtener todas las filas con id> 10
SELECT * from table WHERE cast(emails->>''id'' as integer ) > 10 ;
Sí, eso es posible:
SELECT *
FROM tbl t, json_array_elements(t.json_col->''emails'') AS elem
WHERE elem->>''id'' = 123;
tbl
es el nombre de su tabla, json_col
es el nombre de la columna JSON.
Más detalles en esta respuesta relacionada:
Más sobre el CROSS JOIN LATERAL
implícito en el último párrafo de esta respuesta relacionada:
Índice para admitir este tipo de consulta: