繁体   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