我有一个包含序列化JSON数组的nvarchar列的表。
我要做的是解析这个数组,并将属性的值重新加入到一个字符串中。
以下是专栏内容:

在我的最后一个查询中,我希望它作为一个值来显示,比如"MergedValues“中的”value“。很明显,如果数组中有很多项,我想看"Videowall,Factory,Car“等等。
以下是我迄今所尝试的
SELECT *,
(SELECT Name
FROM OPENJSON(JsonColumn)
WITH
(
Id VARCHAR(200) '$.Id',
Name VARCHAR(200) '$.Name'
))
FROM MyTable
WHERE JsonColumn <> '[]'这个明显的错误出现了。
子查询返回的值超过一个。当子查询跟随=、!=、<、<=、>、>=或子查询用作表达式时,这是不允许的。
我认为这是加入了许多被分析的结果,而这些结果是缺失的。
发布于 2021-02-19 06:54:48
您需要为每一行聚合来自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 Datahttps://stackoverflow.com/questions/66268436
复制相似问题