从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
类型排序的可靠性如何? (因为 VALUE
是 jsonb
类型)。这会始终正常工作吗?
我不想(如果不需要)显式转换: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)
给定 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
类型排序的可靠性如何? (因为 VALUE
是 jsonb
类型)。这会始终正常工作吗?
我不想(如果不需要)显式转换: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)