2017-08-04 55 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' 
相关问题