【问题标题】:sorting data by "value" from jsonb_each(), is reliable?通过 jsonb_each() 中的“值”对数据进行排序,可靠吗?
【发布时间】:2016-12-09 11:45:17
【问题描述】:

给定jsonb 类型的列和数据结构如下:

{ "1": 10000.2, "2": 77.2, "3": -200.09, "4": 12.55 }

需要从此json中检索结果并按VALUE排序

SELECT * FROM jsonb_each(
 (SELECT jsonb_column FROM table WHERE id = 777)
) 
ORDER BY  VALUE  DESC 
LIMIT 100

是的,这给出了正确的结果,但问题是,按jsonb 类型排序的可靠性如何? (因为VALUEjsonb 类型)。这会一直正常工作吗?

我不希望(如果没有必要)显式转换:ORDER BY CAST(VALUE::TEXT AS NUMERIC),因为在 json 中,有大约 500 000 个元素,转换时,它需要 2 倍的时间,而不是仅按 VALUE 排序

【问题讨论】:

  • 有类似的东西 - stackoverflow.com/questions/25967778/… 通常只有正确的转换才能得到预期的结果。
  • @JosMac 只是因为强制转换需要更多时间,有兴趣如果按jsonb类型排序也可以使用。如果不是 100% 可靠,那么我将使用正确的铸造

标签: json postgresql sorting jsonb postgresql-9.5


【解决方案1】:

如果您不混合用于排序的值的数据类型,则不需要强制转换,如果这样做,它将被排序为documented

对象>数组>布尔>数字>字符串>空

n 对对象 > n - 1 对对象

包含 n 个元素的数组 > 包含 n - 1 个元素的数组

因此,如果您尝试针对此类 json 声明:

{
  "date": "2016-10-10",
  "2": "-200.08",
  "3": -200.09,
  "some": "text", 
  "5":-200.08,
  "mt":"-200.09",
  "ar":[0,2]
}

你从上面得到的订单:

t=# SELECT *,pg_typeof(value) FROM jsonb_each((select a from jt where i = 7 )) order by value desc;
 key  |    value     | pg_typeof
------+--------------+-----------
 ar   | [0, 2]       | jsonb
 5    | -200.08      | jsonb
 3    | -200.09      | jsonb
 some | "text"       | jsonb
 date | "2016-10-10" | jsonb
 mt   | "-200.09"    | jsonb
 2    | "-200.08"    | jsonb
(7 rows)

【讨论】:

    猜你喜欢
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2013-10-28
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多