![](/img/trans.png)
[英]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.