![](/img/trans.png)
[英]MySQL JSON Data Need SQL Query to Sort Array of Objects Order based on key value in object
[英]SQL JSON array sort
记录在数据库中:
id info
0 [{"name":"a", "time":"2017-9-25 17:20:21"},{"name":"b", "time":"2017-9-25 23:23:41"},{"name":"c", "time":"2017-9-25 12:56:78"}]
我的目标是排序JSON数组列info
的基础time
,如:
id info
0 [{"name":"c", "time":"2017-9-25 12:56:78"},{"name":"a", "time":"2017-9-25 17:20:21"},{"name":"b", "time":"2017-9-25 23:23:41"},]
我使用sparkSQL,毫无头绪
我的建议
备用数据库存储系统
我不建议以这种方式存储数据。 就像您现在所经历的那样,它只是使您的数据变得不那么易于访问和延展。 如果您像这样存储数据:
id name time
0 a 2017-9-25 17:20:21
0 b 2017-9-25 23:23:41
0 c 2017-9-25 12:56:71
1 ... ...
然后,可以在选择查询的末尾使用ORDER BY
方法按时间顺序选择数据。 例如:
SELECT name, time FROM table_name where id=0 ORDER BY time asc;
如果此表中有更多未显示的列,则可能需要另一个表来有效地存储信息,但是外键和这些类型的表之间的联接的性能优势将超过在一个表中具有所有数据的优势。不方便的JSON数组。
您可以通过将json数组转换为sql结果集,提取排序列,最后将其转换回json数组来实现:
DECLARE @json NVARCHAR(MAX);
SET @json = '[
{"name":"a", "time":"2017-09-25 17:20:21"},
{"name":"b", "time":"2017-09-25 23:23:41"},
{"name":"c", "time":"2017-09-25 12:56:59"}
]';
WITH T AS (
SELECT [Value] AS array_element
, TRY_CAST(JSON_VALUE(Value, 'strict $.time') AS DATETIME) AS sorting
FROM OPENJSON(@json, 'strict $')
)
SELECT STRING_AGG(T.array_element, ',') WITHIN GROUP (ORDER BY sorting)
FROM T
注意:
如果要将其应用于完整的sql表,请按以下方式使用CROSS APPLY:
DECLARE @json NVARCHAR(MAX);
SET @json = '[
{"name":"a", "time":"2017-09-25 17:20:21"},
{"name":"b", "time":"2017-09-25 23:23:41"},
{"name":"c", "time":"2017-9-25 12:56:59"}
]';
WITH dat AS (
SELECT * FROM (VALUES (1,@json), (2,@json)) AS T(id, info)
)
, T AS (
SELECT id, [Value] AS array_element
, TRY_CAST(JSON_VALUE(Value, 'strict $.time') AS DATETIME) AS sorting
FROM dat
CROSS APPLY OPENJSON(info, 'strict $')
)
SELECT id
, STRING_AGG(T.array_element, ',') WITHIN GROUP (ORDER BY sorting) AS info
FROM T
GROUP BY id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.