Así que aquí está mi columna JSON en mi base de datos de Postgres:
{ "objekt_art": { "86": { "code": "86", "bezeichnung_de": "Kino", "bezeichnung_fr": "Cinéma", "bezeichnung_it": "Cinema", "bezeichnung_en": null, "kurz_bezeichnung_de": "Kino", "relevant_fuer_berechnung_steuerquote": true }, "27": { "code": "27", "bezeichnung_de": "Kiosk", "bezeichnung_fr": "Kiosque", "bezeichnung_it": "Chiosco", "bezeichnung_en": null, "kurz_bezeichnung_de": "Kiosk", "relevant_fuer_berechnung_steuerquote": true } } }Necesito poder consultar bezechnung_de, por ejemplo, donde el código = 86. El número de código que puedo pasar de otra tabla.
¿Cómo puedo, por ejemplo, hacer una consulta con dos columnas? Uno con el número y el segundo con bezeichnung_de.
Me gusta esto:
Code Bez 86 KinoEstructura de datos de muestra y tabla de muestra para unir datos: dbfiddle
select je.value -> 'code' as "Code", je.value -> 'bezeichnung_de' as "Bez" from test t cross join jsonb_each((data::jsonb ->> 'objekt_art')::jsonb) je -- In table test_join I insert value 86 for join record inner join test_join tj on je.key::int = tj.json_idComo conoces el código, esto es bastante fácil:
select t.the_column -> 'objekt_art' -> '86' ->> 'code' as code, t.the_column -> 'objekt_art' -> '86' ->> 'bezeichnung_de' as bez from the_table t where ... El valor '86' puede ser un parámetro. Sin embargo, la primera expresión para seleccionar el código no es realmente necesaria, ya que podría reemplazarla con el valor constante (= parámetro) directamente.
Si la clave JSON "externa" no tiene el mismo valor que el valor del code , podría usar algo como esto:
select o.value ->> 'code' as code, o.value ->> 'bezeichnung_de' as bez from the_table t cross join jsonb_each(t.the_column -> 'objekt_art') o(key, value) where o.key = '86' and ... other conditions ...Si está utilizando Postgres 13 o posterior, esto también se puede escribir como una expresión de ruta JSON:
select a.item ->> 'code' as code, a.item ->> 'bezeichnung_de' as bez from ( select jsonb_path_query_first(t.the_column, '$.objekt_art.* ? (@.code == "86")') as item from the_table t where .... ) a Todos los ejemplos asumen que la columna está definida con el jsonb de datos que debería ser. Si no es así, debes lanzarlo: the_column::jsonb