2014-09-22 104 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