【问题标题】:SQL transform JSON: select one field from json array objectsSQL 转换 JSON:从 json 数组对象中选择一个字段
【发布时间】:2019-12-02 10:55:40
【问题描述】:

我有一个用脚本创建的表

CREATE TABLE [dbo].[Queries]
(
    [Id] [INT] NOT NULL,
    [Name] [NVARCHAR](MAX) NOT NULL,
    [Module] [NCHAR](64) NOT NULL,
    [Query] [NVARCHAR](MAX) NOT NULL,

    PRIMARY KEY (Id)
)
GO

Query 列是 JSON 字符串,例如:

[
  {
     "FieldName": "TargetFieldName",
     "Filters": [
       { /* Description Filter 1 */ },
       ...
       { /* Description Filter N */ }
    ]
  }
]

我想从该表中选择:ID、名称、和不同的列名列表作为 THIRD 中的 json 数组列。

例如对于行:

-------------------------------------------------------------------------------------------------
| Id | Name    | Query                                                                          |
-------------------------------------------------------------------------------------------------
| 7  | Query 7 |  [{"FieldName": "A", ... },{ "FieldName": "B" ...},{"FieldName": "B", ... }]   |
-------------------------------------------------------------------------------------------------

我想买

| Id | Name    | DistinctFieldNames |
+----+---------+--------------------+
| 7  | Query 7 |  ["A","B"]         |

我的问题是:

  1. 是否可以在 SQL Server 端将 json 数据转换为其他格式的 json 数据?
  2. 如何编写 SQL 查询从 json 对象数组中选择一个字段?

【问题讨论】:

    标签: sql json sql-server sql-server-2017


    【解决方案1】:

    似乎最简单的方法是使用子查询来读取 JSON,并使用 STRING_AGG 来创建新的:

    SELECT V.ID,
           V.Name,
           '[' + STRING_AGG('"' + ca.FieldName + '"',',') WITHIN GROUP (ORDER BY ca.FieldName)  + ']'        
    FROM (VALUES(7,'Query 7','[{"FieldName": "A"},{ "FieldName": "B"},{"FieldName": "B"}]'))V(ID,[Name], Query)
         CROSS APPLY (SELECT DISTINCT OJ.FieldName
                      FROM OPENJSON (V.Query)
                           WITH (FieldName char(1)) OJ) ca --May  need larger size, char(1) based on your sample data
    GROUP BY V.ID,
             V.[Name];
    

    【讨论】:

      【解决方案2】:

      您应该知道,此代码仅在 SQL Server 2017 及更高版本上运行。

      SELECT Id,Name,
          (SELECT STRING_AGG(JSON_VALUE(value, '$.FieldName'), ',') As FieldName 
           FROM OPENJSON(Queries.Query)) 
      FROM dbo.Queries
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-30
        相关资源
        最近更新 更多