簡體   English   中英

將 JSON 數組的屬性加入一個值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM