2017-10-04 67 views
1

的一個節點我有這個JSON在我的數據庫:PostgreSQL的 - NoSQL的查詢思路選擇JSON

{ 
     "Id": 1, 
     "Questions": [ 
     { 
      "QuestionId": 6, 
      "Description": "Question 1", 
      "Alternatives": [ 
      { 
       "Index": 1, 
       "CorrectAnswer": false, 
       "AlternativeId": 26, 
       "QuestionId": 6, 
       "Description": "Alternative one", 
       "Selected": false 
      }, 
      { 
       "Index": 2, 
       "CorrectAnswer": true, 
       "AlternativeId": 27, 
       "QuestionId": 6, 
       "Description": "Alternative two", 
       "Selected": false 
      } 
      ] 
     }, 
     { 
      "QuestionId": 7, 
      "Description": "Question 2", 
      "Alternatives": [ 
      { 
       "Index": 1, 
       "CorrectAnswer": false, 
       "AlternativeId": 26, 
       "QuestionId": 6, 
       "Description": "Alternative one", 
       "Selected": false 
      }, 
      { 
       "Index": 2, 
       "CorrectAnswer": true, 
       "AlternativeId": 27, 
       "QuestionId": 6, 
       "Description": "Alternative two", 
       "Selected": false 
      } 
      ] 
     } 
     ] 
    } 

我不能得到這個文件只是一個問題。我試過以下查詢:

select data#>'{Questions}' from db.my_table 
where (data #> '{Questions,0,QuestionId}')::numeric = 6; 

SELECT data ->> 'Questions' AS Questions FROM db.my_table 
WHERE (data -> 'Questions' ->> 'QuestionId')::numeric = 6; 

SELECT data ->> 'Questions' AS Questions FROM db.my_table 
WHERE data -> 'Questions' ->> 'QuestionId' = '6' 

我能做什麼錯?我總是得到0受影響的行的回報。

文檔:

https://www.postgresql.org/docs/current/static/datatype-json.html https://www.postgresql.org/docs/current/static/functions-json.html

每一個幫助是值得歡迎!

回答

2

講起每個查詢的第一:

select data#>'{Questions}' from db.my_table 
where (data #> '{Questions,0,QuestionId}')::numeric = 6; 

這實際上失敗(ERROR: cannot cast type json to numeric)。您可以將where子句中的運算符更改爲#>>,並且不會再有錯誤 - #>>返回可以轉換爲數字的文本。在這一點上,查詢將返回整個Questions數組,但是,而不是您想要的具體問題。

爲什麼?因爲所有的問題都是同一行的一部分。

SELECT返回行,其WHERE子句對行進行操作。由於在單行中有很多值,因此您將無法有條件地使用此方法提取json子對象。

其他兩個查詢成功運行,但不會產生結果:

SELECT data ->> 'Questions' AS Questions FROM db.my_table 
WHERE (data -> 'Questions' ->> 'QuestionId')::numeric = 6; 

SELECT data ->> 'Questions' AS Questions FROM db.my_table 
WHERE data -> 'Questions' ->> 'QuestionId' = '6' 

在這兩種情況下,你在你的JSON BLOB索引不存在的字段。 Questions是一個數組,因此用一個字符串索引它不起作用,但json足夠鬆散,它可以讓你嘗試。換句話說,條款WHERE data -> 'Questions' ->> 'QuestionId' = '6'只是不匹配任何行。

訣竅是將每個問題連成一行。這有點複雜,但不是很難做到。

首先,看看函數json_array_elements,它看起來應該可以工作 - 它接受一個json數組並將每個元素作爲一行返回單列(名爲「value」)。乍一看,似乎你應該可以做一些這樣的形式:

SELECT value FROM json_array_elements(...) 
WHERE value ->> 'QuestionId'::numeric = 6; 

不幸的是,它不是那麼簡單。這裏有一個查詢是有效的:

SELECT datatable.question 
    FROM my_table, 
    json_array_elements(my_table.data -> 'Questions') AS datatable(question) 
WHERE (question->>'QuestionId')::numeric = 6; 

好吧,讓我們分析一下。最終,它返回我們使用json_array_elements調用創建的datatable表的question字段。 question是一個json對象,我們過濾只返回QuestionID == 6的對象。

但請注意,我們也從my_table中選擇,因爲最終這是數據的來源。在這種情況下,我們在my_tabledatatable之間進行無約束的笛卡爾連接。這不好,可能不會很好地擴展。但它適用於我們目前只有幾行的情況。

希望給你一個開始的地方。

+0

嘿@jmelesky感謝您的迴應!但我有以下錯誤: '錯誤:函數json_array_elements(jsonb)不存在 線1:從db.m選擇json_array_elements(數據 - >'問題')... ^ 提示:沒有函數匹配給定名稱和參數類型。您可能需要添加顯式類型轉換。 **********錯誤**********'當我運行最後一個查詢(笛卡爾)。我的專欄是jsonb ... – IgoR

+1

如果您的專欄是jsonb,而不是json,那麼您應該使用jsonb功能而不是json功能。正如[documentation](https://www.postgresql.org/docs/current/static/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE)所示,這意味着使用'jsonb_array_elements',而不是'json_array_elements '。將來,在你的問題中提供關於你的模式的更多信息將會有所幫助。 – jmelesky

+0

!非常感謝你,現在的作品......我會提供一些有關我的模式的信息,以便你能看到一個可能的「最佳解決方案」。 :) – IgoR