简体   繁体   English

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

[英]SQL transform JSON: select one field from json array objects

I have table created with a script我有一个用脚本创建的表

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

where Query column is JSON string like:其中Query列是 JSON 字符串,如:

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

And I'd like to select from that table: Id, Name, and distinct list of column names as json array in THIRD column.我想从该表中选择:Id、Name和列名的不同列表作为第三列中的json 数组

For example for row:例如对于行:

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

I'd like to get我想得到

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

My questions are:我的问题是:

  1. Is it possible at all transform json data to other format json data at SQL Server side?是否有可能在 SQL Server 端将 json 数据转换为其他格式的 json 数据?
  2. How to write a SQL query to select one field from json array of objects?如何编写 SQL 查询以从 json 对象数组中选择一个字段?

Seems like the easiest would be to use a subquery to read the JSON, and the STRING_AGG to create the new one:似乎最简单的方法是使用子查询来读取 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];

You should know that this code only run on SQL Server 2017 and higher version.您应该知道此代码仅在 SQL Server 2017 及更高版本上运行。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM