SQL转换JSON:从JSON数组对象中选择一个字段

问题描述 投票:1回答:2

我有使用脚本创建的表

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,名称,以及列名的不同列表作为json数组在[[THIRD列中。

例如用于行:

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

我想得到

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

我的问题是:

    是否有可能在SQL Server端将json数据全部转换为其他格式的json数据?
  1. 如何编写SQL查询以从对象的json数组中选择一个字段?
sql json sql-server sql-server-2017
2个回答
0
投票
似乎最简单的方法是使用子查询读取JSON,然后使用STRING_AGG创建新的JSON:

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];


0
投票
您应该知道此代码仅在SQL Server 2017和更高版本上运行。

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

© www.soinside.com 2019 - 2024. All rights reserved.