2014-09-22 101 views
11

我有一個Postgres表,其中有JSON類型的列,其中有一堆JSON對象。我想查詢表記錄並按JSON字段中存儲的值排序結果。我正在查詢運行,但他們沒有正確排序。我沒有找到大量專門訂購JSON字段類型的文檔,所以希望有人遇到這種情況。通過JSON數據類型order by postgres

data: {name: "stuff", value: "third option"} 
data: {name: "stuff", value: "awesome stuff"} 
data: {name: "stuff", value: "way cooler stuff"} 

下面的SQL執行,但返回的結果無序

select * from table ORDER BY data->>'value asc' 

我使用的鐵軌,但已經嘗試運行SQL直接作爲井w /同樣的結果

回答

26

你把asc在字段名。在json中沒有鍵名爲value asc,所以data ->> 'value asc'將始終返回NULL

你真的想:

select * from table ORDER BY data->>'value' ASC 

相匹配的JSON,甚至可能:

select * 
from table 
WHERE data ->> 'name' = 'stuff' 
ORDER BY data->>'value' ASC 
+0

我也試過。它運行,但仍然沒有正確排序記錄。 (通過值的東西)我需要投的價值或東西? – user1767105 2014-09-22 21:46:03

+0

@ user1767105查看更新。你試圖獲得一個不存在的關鍵字'stuff',所以它將等同於'ORDER BY NULL'。 – 2014-09-23 01:59:52

+0

明白了。對不起,我有上面的數據對象不正確。真的是數據:{「stuff」=> {「name」=>「stuff」,「value」:「awesome stuff」}}查詢結束爲select ....按數據排序 - >「stuff」 - > >「價值」你的幫助讓我在那裏雖然如此謝謝!另外一個很好的資源,以及:http://clarkdave.net/2013/06/what-c​​an-you-do-with-postgresql-and-json/ – user1767105 2014-09-23 02:28:41

6

嘗試:

ORDER BY cast(data->>'value' as integer) ASC

+1

@EugenKonkov修復了問題和答案 – 2017-05-01 19:54:51

1

使用->,而不是->>->>得到了JSON對象字段爲tex t):

select * from my_table ORDER BY data->'some_number' asc; 
+0

儘管這確實直接回答了這個問題,但我很感激我找到了這個問題。它幫助我解決了當它是一個數字時按字母順序排序的JSON列。 – datashaman 2018-02-20 13:15:07