Tengo la siguiente matriz json almacenada en una columna en mi postgres db. Estoy tratando de escribir una consulta para obtener todas las filas por país nombre .

La consulta se ejecutará pero no puede hacer que devuelva ningún valor.

El nombre de la columna es sources y es del tipo de matriz json.

Valor de ejemplo

[{
    "name": "Albania",
    "type": "domain",
    "order": 2
},{
    "name": "Samoa",
    "type": "domain",
    "order": 3
},{
    "name": "United States",
    "type": "domain",
    "order": 4
}]

Aquí está la consulta que estoy tratando de ejecutar:

 SELECT * from my_table,
        json_array_elements(sources->'name') elem
            where elem->>'name' = 'Samoa';
0
Nicholas Porter 29 dic. 2019 a las 03:02

2 respuestas

La mejor respuesta

Intente utilizar EXISTS y una subconsulta correlacionada.

SELECT *
       FROM my_table t
       WHERE EXISTS (SELECT *
                            FROM json_array_elements(t.sources) jae (e)
                            WHERE jae.e->>'name' = 'Samoa');
1
sticky bit 29 dic. 2019 a las 02:06

Casi lo tienes correcto. El problema es que especificó 'nombre' una vez con demasiada frecuencia. fuentes no tiene una clave de nivel superior llamada 'nombre' (porque es una matriz, no tiene claves de cadena), por lo que da 'nulo', que no se puede anular. Entonces:

SELECT * from my_table,
        json_array_elements(sources) elem
            where elem->>'name' = 'Samoa';

Sin embargo, si no necesita el elemento específico que contiene la coincidencia como una columna separada, puede usar el operador de contención para deshacerse de la unión por completo.

select * from my_table where sources::jsonb @> '[{"name":"Samoa"}]';
1
jjanes 29 dic. 2019 a las 15:20