【问题标题】:order by JSON data type postgres按 JSON 数据类型 postgres 排序
【发布时间】:2014-09-22 06:22:16
【问题描述】:

我有一个 Postgres 表,其中包含 JSON 类型的列,其中包含一堆 JSON 对象。我想查询表记录并按存储在 JSON 字段中的值对结果进行排序。我正在运行查询,但它们的排序不正确。我没有找到大量关于专门订购 JSON 字段类型的文档,所以希望有人遇到过这个问题。

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' 

我正在使用 Rails,但也尝试过直接运行 SQL,结果相同

【问题讨论】:

    标签: json postgresql


    【解决方案1】:

    您将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 
    

    【讨论】:

    • 我也试过了。它运行,但仍然没有正确排序记录。 (通过东西的值)我需要转换值还是什么?
    • @user1767105 查看更新。您正在尝试获取一个不存在的密钥“东西”,因此它将等同于 ORDER BY NULL
    • 知道了。抱歉,我上面的数据对象不正确。真的是 data: {"stuff" => {"name" => "stuff", "value": "awesome stuff"}} 查询结果是 select....order by data->"stuff"-> >“值”你的帮助让我到了那里,所以谢谢!也是一个很好的资源:@​​987654321@
    • 这应该如何处理整数?它们似乎被排序为字符串:1, 10, 46, 6 而不是 1, 6, 10, 46
    • @Natim 请发布一个新的、单独的问题并链接到该问题以获取上下文。包括完整的示例。
    【解决方案2】:

    使用-> 代替->>->> 获取 JSON 对象字段作为文本):

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

    【讨论】:

    • 虽然这确实直接回答了这个问题,但我很感激我找到了这个。它帮助我解决了当 JSON 列是数字时按字母顺序排序的问题。
    【解决方案3】:

    试试:

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

    【讨论】:

    • @EugenKonkov 修复了问题和答案
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2015-05-22
    • 2022-01-08
    • 2017-10-03
    相关资源
    最近更新 更多