mysql - SQL JSON 数组排序

标签 mysql sql arrays json apache-spark-sql

在数据库中记录:

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"}]

我的目标是根据 time 对 json 数组列 info 进行排序,例如:

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,一无所知

最佳答案

可以通过将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

关于mysql - SQL JSON 数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46481174/

相关文章:

mysql - 分组依据并限制 mySql 中的输出

python - 插入操作时 python 和 mysql 的 sql 语法错误

android - 如何在不更改主键的情况下执行 SQL Insert 或 Replace like operator?

python - 在Python中停止SQL查询

javascript - 字符串数组因意外 token javascript 引发错误

java - 二维字符串数组中基于整数的排序

php - 通知 : Undefined index: variable

php - Laravel 通过多列分组获取最新记录

php - 如何在第一个数组的基础上组合两个数组

mysql - 我应该使用哪种连接? 【EF4.0代码优先】