从jsonb_each()按"value"排序数据靠谱吗?

sorting data by "value" from jsonb_each(), is reliable?

给定 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

如果您不为您订购的值混合数据类型,您不需要转换,如果您这样做,它将被订购为documented.

Object > Array > Boolean > Number > String > Null

Object with n pairs > object with n - 1 pairs

Array with n elements > array with n - 1 elements

所以如果你尝试你的陈述反对这样的 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)