[英]How to split one column with array merge value to array and join other table then merge back
[英]Join a JSON array's property back into one value
我有一个包含序列化 JSON 数组的nvarchar
列的表。
我要做的是解析该数组并将属性的值连接回一个字符串。
以下是专栏内容:
在我的最终查询中,我希望它显示为一个值,例如“MergedValues”中的“Videowall”。 显然,如果数组有很多项目,我希望看到“拼接墙、工厂、汽车”等。
这是我到目前为止尝试过的
SELECT *,
(SELECT Name
FROM OPENJSON(JsonColumn)
WITH
(
Id VARCHAR(200) '$.Id',
Name VARCHAR(200) '$.Name'
))
FROM MyTable
WHERE JsonColumn <> '[]'
出现这个明显的错误
子查询返回超过 1 个值。 当子查询跟随 =, ,=, <, <=, > 时,这是不允许的。 >= 或当子查询用作表达式时。
我认为这是缺少许多解析结果的连接。
您需要为每一行汇总来自OPENJSON()
调用的结果:
桌子:
SELECT *
INTO Data
FROM (VALUES
(0, 0, 25200, '[{"Id":"10564", "Name": "Videowall"}]'),
(0, 0, 9200, '[{"Id":"10564", "Name": "Videowall"},{"Id":"10565", "Name": "Factory"}]')
) v (OriginalEstimateSeconds, RemainingEstimateSeconds, TimeSpentSeconds, ComponentsJSON)
陈述:
SELECT
OriginalEstimateSeconds, RemainingEstimateSeconds, TimeSpentSeconds, ComponentsJSON,
MergedValues = (
SELECT STRING_AGG([Name], ',')
FROM OPENJSON(ComponentsJSON) WITH (Name varchar(100) '$.Name')
)
FROM Data
结果:
... ComponentsJSON MergedValues
---------------------------------------------------------------------------------------------
... [{"Id":"10564", "Name": "Videowall"}] Videowall
... [{"Id":"10564", "Name": "Videowall"},{"Id":"10565", "Name": "Factory"}] Videowall,Factory
如果新生成的文本中$.Name
值的顺序很重要,您可以使用以下脚本:
SELECT
OriginalEstimateSeconds, RemainingEstimateSeconds, TimeSpentSeconds, ComponentsJSON,
MergedValues = (
SELECT STRING_AGG(JSON_VALUE([value], '$.Name'), ',') WITHIN GROUP (ORDER BY CONVERT(int, [key]))
FROM OPENJSON(ComponentsJSON)
)
FROM Data
不需要子查询,但应使用CROSS APPLY
连接表和OPENJSON
表达式,并在末尾使用STRING_AGG()
以聚合提取的名称,例如
SELECT JsonColumn, STRING_AGG(Name, ',') AS [Merged Values]
FROM MyTable
CROSS APPLY OPENJSON(JsonColumn)
WITH
(
Id VARCHAR(200) '$.Id',
Name VARCHAR(200) '$.Name'
)
GROUP BY JsonColumn
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.