2017-01-25 3 views
-4

Ich habe die JSON in folgendem Format in Postgres JsonB Spalte gespeichert:Speicher JSON Array von Arrays in PostgreSql

[ 
    [ 

      {"cid":"CID1","Display":"User One","FName":"User","LName":"One"}, 
      {"cid":"CID1","Display":"User Two","FName":"User","LName":"Two"}, 
      {"cid":"CID1","Display":"User Three","FName":"User","LName":"Three"}, 
      {"cid":"CID2","Display":"User One","FName":"User","LName":"One"}, 
      {"cid":"CID2","Display":"User Two","FName":"User","LName":"Two"}, 
      {"cid":"CID2","Display":"User Three","FName":"User","LName":"Three"}  

    ], 


    [ 

      {"cid":"CID1","Display":"User One","FName":"User","LName":"One"}, 
      {"cid":"CID1","Display":"User Two","FName":"User","LName":"Two"}, 
      {"cid":"CID1","Display":"User Three","FName":"User","LName":"Three"}, 
      {"cid":"CID2","Display":"User One","FName":"User","LName":"One"}, 
      {"cid":"CID2","Display":"User Two","FName":"User","LName":"Two"}, 
      {"cid":"CID2","Display":"User Three","FName":"User","LName":"Three"}  

    ] 
] 

ich das erste Array von Index nehmen will und dann abfragen auf Tasten wie cid, Display, FName, LName. Dann möchte ich in einer anderen Abfrage das zweite Array nach Index und Abfrage auf den gleichen Schlüsseln nehmen. Die Abfrage sollte die Zeilen zurückgeben, die die Abfrage erfüllen. Welches ist das bestmögliche Format, in dem ich JSON speichern kann und wie kann ich die Schlüssel wie oben beschrieben abfragen?

+0

Werfen Sie einen Blick auf: http://StackOverflow.com/Help/how-to-ask – McNets

+1

BTW, dieser JSON-Text ist nicht wohlgeformt. – McNets

+0

Sie haben Recht. Nach dem dritten Element des zweiten Arrays fehlte ein Komma. Danke, dass du darauf hingewiesen hast. – puneet

Antwort

1

Die erste Anweisung gibt zwei Zeilen zurück, eine für jedes Array.

select jsonb_array_elements(msg->'root') as el 
    from js 

Dann gibt jede einzelne Werte als Text zurück.

with aa as 
(
    select jsonb_array_elements(msg->'root') as el 
    from js 
) 
select jsonb_array_elements(el)->>'cid' as cid, 
     jsonb_array_elements(el)->>'Display' as Display, 
     jsonb_array_elements(el)->>'FName' as FName, 
     jsonb_array_elements(el)->>'LName' as LName   
from aa; 

Das gibt drittes Element des zweiten Array

select (ARRAY(select * from jsonb_array_elements(A1.Elements)))[3] Elem 
from 
    (select (ARRAY(select * from jsonb_array_elements(msg->'root')))[2] Elements 
    from js) A1; 

Unter Wertdaten gemäß I in meinem resxtester Projekt verwendet habe. Vielleicht passt es nicht zu deinem JSON-Text.

{ "cid": "CID2", "FName": "Benutzer", "LName": "Drei", "Display": "User Three"}

es hier ansehen : http://rextester.com/IAU74251

aktualisieren

Filter durch einen Teil des Feldes der ersten Anordnung:

select * from     
(select jsonb_array_elements(msg->'root'->0) as a from js) elem 
where elem.a->>'Display' like '%Two'; 
+0

Hallo McNets, du bist fast da. Sie haben Zeilen von beiden Arrays abgerufen. Ich möchte jedoch nur zu einem bestimmten Zeitpunkt Zeilen von nur einem Array abrufen und nicht beide. Meine Abfrage würde den Index enthalten, und dieser Index würde mir sagen, an welchem ​​Array ich arbeiten muss. Irgendwie muss ich bestimmte Array abrufen, da der Index – puneet

+0

Ok, ich denke, ich habe es. Jetzt können Sie index verwenden. @puneet – McNets

+0

Sie sind der Retter, @McNets. Danke. – puneet

Verwandte Themen