[英]SQL transform JSON: select one field from json array objects
我有一個用腳本創建的表
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、Name和列名的不同列表作為第三列中的json 數組。
例如對於行:
-------------------------------------------------------------------------------------------------
| Id | Name | Query |
-------------------------------------------------------------------------------------------------
| 7 | Query 7 | [{"FieldName": "A", ... },{ "FieldName": "B" ...},{"FieldName": "B", ... }] |
-------------------------------------------------------------------------------------------------
我想得到
| Id | Name | DistinctFieldNames |
+----+---------+--------------------+
| 7 | Query 7 | ["A","B"] |
我的問題是:
似乎最簡單的方法是使用子查詢來讀取 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];
您應該知道此代碼僅在 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.