SQL 如何从单个列中的所有值创建 JSON 数组

Posted

技术标签:

【中文标题】SQL 如何从单个列中的所有值创建 JSON 数组【英文标题】:SQL how to create a JSON array from all the values in a single column 【发布时间】:2021-12-03 10:02:39 【问题描述】:

下面的这个查询返回一个我想从中创建 JSON 数组的列:

SELECT CP.PageID 
FROM CommClient.dbo.ClientPage AS CP
INNER JOIN CommApp.dbo.Page as P ON CP.PageID = P.PageID 
INNER JOIN CommApp.dbo.PageGroup as PG ON P.PageGroupID = PG.PageGroupID
LEFT JOIN (
   SELECT DISTINCT ParentPageID FROM [CommApp].[dbo].[Page]
) AS PP 
ON P.PageID = PP.ParentPageID
WHERE ClientID = 102 AND P.ApplicationID = 4
ORDER BY P.pageID

我需要的结果是这样的值数组:[4000, 4010, 4110 ...]

我尝试在该查询的末尾添加 FOR JSON PATH,但我得到了一个对象数组 (["pageID":4000,"pageID":4010,"pageID": 4110 ....) 而不是一个值数组,我不知所措,我是 SQL 的新手...谢谢!

【问题讨论】:

打开***.com/questions/41758870/… 。我想它会对你有所帮助。 您的 DBMS 是什么?看起来像 SQL Server。请。标记它。 【参考方案1】:

mysql 中有一个名为 GROUP_CONCAT 的函数,您可以编写如下。注意最后的group by子句和select中的group_concat

SELECT GROUP_CONCAT(CP.PageID) as PageID
FROM CommClient.dbo.ClientPage AS CP
INNER JOIN CommApp.dbo.Page as P ON CP.PageID = P.PageID 
INNER JOIN CommApp.dbo.PageGroup as PG ON P.PageGroupID = PG.PageGroupID
LEFT JOIN (
   SELECT DISTINCT ParentPageID FROM [CommApp].[dbo].[Page]
) AS PP 
ON P.PageID = PP.ParentPageID
WHERE ClientID = 102 AND P.ApplicationID = 4
GROUP BY CP.PageID
ORDER BY P.pageID

【讨论】:

【参考方案2】:

在不同的 DBMS 中有所不同。 SQL 服务器:

select '[' + string_agg(<expression>, ',') + ']'
-- the rest of your query

Postgres:

select json_agg(<expression>)
-- the rest of your query

甲骨文:

select json_arrayagg(<expression>)
-- the rest of your query

【讨论】:

以上是关于SQL 如何从单个列中的所有值创建 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 数组值合并到单个 CSV 列中

SQL 查询将多条记录中的值组合到单个列中

Laravel:在单个 SQL 列中插入数组对象

如何使用 Redshift 从 JSON 数组列中获取值?

如何从单个数组中的两个查询中传递 json

从 MySQL JSON 列中提取 JSON 对象的值作为数组