繁体   English   中英

SQL JSON数组排序

[英]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

注意:

  • 由于无效的月份和秒,我对样本数据进行了一些更改。
  • STRING_AGG()函数仅可用于SQL 2017 / Azure SQL数据库。 对于较旧的版本,请使用经典的“ FOR XML PATH”方法,我将作为练习留给读者。

如果要将其应用于完整的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM