2017-08-04 123 views
1

我有一個表名doc_definitionjsondefinition具有類似的格式:如何從兩個不同的表中查詢JSON數組?

[{ 
    "id":"0", 
    "name:"Ques1" 
},{ 
    "id":"1", 
    "name:"Ques2" 
},{ 
    "id":"2", 
    "name:"Ques3" 
}] 

,併爲具有另一jsondef_val與格式另一個表doc

{ 
    "0":{ 
     "value":"Ans1" 
     }, 
    "1":{ 
     "value":"Ans2" 
     }, 
    "2":{ 
     "value":"Ans3" 
     } 
} 

我想創建一個Postgres SQL查詢,通過匹配兩個json中的id字段來給出相應問題的值。 到目前爲止,我想出了這一點:

SELECT json_array_elements(def.definition) ->> 'name' AS json_test 
FROM document_definitions AS def 
INNER JOIN documents AS doc 
    ON doc.document_definition_id = def.id 
WHERE doc.id = 892 AND json_array_elements(def.definition) ->> 'name' = 'Ques2' 

但這拋出異常:

ERROR: argument of AND must not return a set 

當我把json_array_elements(def.definition) ->> 'name' = 'Ques2'SELECT條款,它返回boolean值。

我不知道什麼是錯的。 Plz幫助?

+0

你得重新考慮.... json_arra_elements'的'定義爲'擴展JSON數組一組JSON values.' ..That的爲什麼第一次查詢失敗。進一步,。因爲在該組值'Ques2'存在的情況下,第二個查詢返回true ...閱讀此https://www.postgresql.org/docs/9.5/static/functions-json.html並嘗試重新考慮您的方法 –

+0

@ JasonKrs我重新思考了我的方法,並提出了一個適用於我的查詢。我已將它發佈在答案中。如果有什麼我可以改進的,請告訴我。 – dARKaRK1002

回答

0

很多試錯後,我想出了這一點。 Plz讓我知道,如果我能以任何方式改善這一點。

SELECT definition_json.definition_value -> definition_json.def_value_id ->> 'value' AS definition_value 
FROM (
    SELECT json_array_elements(def.definition) ->> 'name' = 'Ques2' AS is_definition_present, 
     json_array_elements(def.definition) ->> 'id' AS def_value_id, 
     doc.definition_value, doc.id AS document_id, def.id AS definition_id 
    FROM document_definitions AS def 
    INNER JOIN documents AS doc 
     ON doc.document_definition_id = def.id 
    ) AS definition_json 
WHERE definition_json.is_definition_present = 't' AND definition_json.document_id = 892 
+0

只要你解決了你的問題就沒問題。如果你遇到一些性能問題,你會考慮調整查詢。不要忘記告訴我,如果我的回答無論如何幫助你,或者如果完全準確的話,我可以刪除它以避免誤導別人 –

0

怎麼樣查詢:

SELECT json_array_elements(def.definition) ->> 'name' AS json_test 
FROM document_definitions AS def 
INNER JOIN documents AS doc 
    ON doc.document_definition_id = def.id 
WHERE doc.id = 892 AND (json_array_elements(def.definition) ::json->> 'name') = 'Ques2' 
相關問題