首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL transform JSON:从json数组对象中选择一个字段

问SQL transform JSON:从json数组对象中选择一个字段
EN

Stack Overflow用户
提问于 2019-12-02 10:55:40
回答 2查看 1.8K关注 0票数 1

我有用脚本创建的表

代码语言:javascript
复制
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字符串,如下所示:

代码语言:javascript
复制
[
  {
     "FieldName": "TargetFieldName",
     "Filters": [
       { /* Description Filter 1 */ },
       ...
       { /* Description Filter N */ }
    ]
  }
]

我想从那个表中选择: Id、Name、和第三列中作为json数组的不同列名列表。

例如,行:

代码语言:javascript
复制
-------------------------------------------------------------------------------------------------
| Id | Name    | Query                                                                          |
-------------------------------------------------------------------------------------------------
| 7  | Query 7 |  [{"FieldName": "A", ... },{ "FieldName": "B" ...},{"FieldName": "B", ... }]   |
-------------------------------------------------------------------------------------------------

我想要

代码语言:javascript
复制
| Id | Name    | DistinctFieldNames |
+----+---------+--------------------+
| 7  | Query 7 |  ["A","B"]         |

我的问题是:

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

回答 2

Stack Overflow用户

发布于 2019-12-02 11:03:31

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

代码语言:javascript
复制
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];
票数 1
EN

Stack Overflow用户

发布于 2019-12-02 11:56:49

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

代码语言:javascript
复制
SELECT Id,Name,
    (SELECT STRING_AGG(JSON_VALUE(value, '$.FieldName'), ',') As FieldName 
     FROM OPENJSON(Queries.Query)) 
FROM dbo.Queries
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59137437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档