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 数组的主要内容,如果未能解决你的问题,请参考以下文章