2017-08-17 1 views
1

Ich versuchte, meinen Json-Array am Beispiel abfragen hier: How do I query using fields inside the new PostgreSQL JSON datatype?postgresql json Array Abfrage

Sie verwenden das Beispiel:

SELECT * 
FROM json_array_elements(
    '[{"name": "Toby", "occupation": "Software Engineer"}, 
    {"name": "Zaphod", "occupation": "Galactic President"} ]' 
) AS elem 
WHERE elem->>'name' = 'Toby'; 

Aber mein Json-Array sieht eher aus wie diese (wenn Sie das Beispiel verwenden) :

{ 
    "people": [{ 
      "name": "Toby", 
     "occupation": "Software Engineer" 
    }, 
    { 
     "name": "Zaphod", 
     "occupation": "Galactic President" 
    } 
    ] 
} 

Aber ich erhalte eine Fehlermeldung: Fehler: json_array_elements auf einem nicht-Array nicht nennen

Ist mein JSON "Array" nicht wirklich ein Array? Ich muss diese JSON-Zeichenkette verwenden, weil sie in einer Datenbank enthalten ist, also müsste ich ihnen sagen, dass sie es reparieren soll, wenn es kein Array ist. Oder gibt es eine andere Möglichkeit, es abzufragen?

Ich lese Dokumentation, aber nichts hat funktioniert, immer Fehler erhalten.

Antwort

1

Die json Array hat eine Schlüssel people so my_json->'people' in der Funktion verwendet werden:

with my_table(my_json) as (
values(
'{ 
    "people": [ 
     { 
      "name": "Toby", 
      "occupation": "Software Engineer" 
     }, 
     { 
      "name": "Zaphod", 
      "occupation": "Galactic President" 
     } 
    ] 
}'::json) 
) 
select t.* 
from my_table t, 
json_array_elements(my_json->'people') elem 
where elem->>'name' = 'Toby'; 

Die Funktion json_array_elements() unnests die json Array und erzeugt alle seine Elemente als Zeilen:

select elem->>'name' as name, elem->>'occupation' as occupation 
from my_table t, 
json_array_elements(my_json->'people') elem 

    name |  occupation  
--------+-------------------- 
Toby | Software Engineer 
Zaphod | Galactic President 
(2 rows)  

Wenn Sie an Tobys Beruf interessiert sind:

select elem->>'occupation' as occupation 
from my_table t, 
json_array_elements(my_json->'people') elem 
where elem->>'name' = 'Toby' 

    occupation  
------------------- 
Software Engineer 
(1 row) 
+0

Danke, das hat funktioniert. Ich hatte einige schlechte Daten in anderen Zeilen, also musste ich nur eine "gute" Zeile wählen. Jetzt habe ich noch eine Frage: Wie kann ich zum Beispiel nur den "Beruf" auswählen? Wo du sagst, wählst du. * Ich will nur den "Beruf". Ich versuchte t.my_json -> 'Beruf' und es hat nicht funktioniert. Die Ergebnisse zeigen die Spalte? und null Daten, die in meiner Zeile nicht null sind. –

+0

Siehe die aktualisierte Antwort. – klin

+0

Du bist super B-) –