我希望構建一個優化的資料 JSON 結構,只包含資料,沒有名稱。我將在另一個 JSON 中包含這些名稱。
例如
[["1", "William"],["2", "Dylan"]]
我正在查看“for json auto”,運行這樣的查詢。
declare @t table(id int, name varchar(20))
insert into @t (id, name) values( 1, 'William')
insert into @t (id, name) values( 2, 'Dylan')
declare @result as varchar(max)
select id, name from @t for json auto
但是,它包含每個值的名稱。
[{"id":1,"name":"William"},{"id":2,"name":"Dylan"}]
有沒有辦法指示 SQL Server 省略名稱并只回傳一個字串陣列?
我需要更新幾百個查詢,所以我希望得到一個不需要對基本查詢進行太多修改的答案。
uj5u.com熱心網友回復:
不幸的是,SQL Server 不支持該JSON_AGG功能或類似功能。你可以用STRING_AGG和破解它STRING_ESCAPE。
您可以使用單個聚合來執行此操作并將行連接在一起
SELECT '[' STRING_AGG(CONCAT(
'["',
id,
'","',
STRING_ESCAPE(name, 'json'),
'"]'
), ',') ']'
FROM @t t;
或者使用嵌套聚合,首先聚合非透視子查詢中的每一行,然后聚合所有行
SELECT '[' STRING_AGG('[' j.json ']', ',') ']'
FROM @t t
CROSS APPLY (
SELECT STRING_AGG('"' STRING_ESCAPE(value, 'json') '"', ',')
FROM (VALUES
(CAST(id AS nvarchar(max))),
(name)
) v(value)
) j(json);
db<>小提琴
我假設列不可為空。可空列需要特殊處理,我將其留給讀者作為練習。
uj5u.com熱心網友回復:
與查理的并沒有什么不同,但用于CONCAT_WS洗掉一些顯式"字符:
SELECT [json] = '['
STRING_AGG('["' CONCAT_WS('", "', id,
STRING_ESCAPE(COALESCE(name,''), N'JSON'))
'"]', ',') ']'
FROM @t;
輸出(添加第三行后,values(3, NULL):
| json |
|---|
| [["1", "威廉"],["2", "迪倫"],["3", ""]] |
- 示例db<>fiddle
如果您想要null不帶引號的文字字串:
SELECT [json] = '['
STRING_AGG('['
CONCAT_WS(', ', CONCAT('"', id, '"'),
COALESCE('"' STRING_ESCAPE(name, N'JSON') '"', 'null'))
']', ',') ']'
FROM @t;
輸出:
| json |
|---|
| [[“1”,“威廉”],[“2”,“迪倫”],[“3”,空]] |
- 示例db<>fiddle
如果您不希望NULL值在 JSON 中顯示列,只需洗掉COALESCE:
SELECT [json] = '['
STRING_AGG('["' CONCAT_WS('", "', id,
STRING_ESCAPE(name, N'JSON'))
'"]', ',') ']'
FROM @t;
輸出:
| json |
|---|
| [[“1”,“威廉”],[“2”,“迪倫”],[“3”]] |
- 示例db<>fiddle
如果您根本不希望 JSON 中出現該行,只需將其過濾掉:
FROM @t WHERE name IS NOT NULL;
如果該列不允許 NULL,請明確說明,這樣我們就不必猜測(確認id是否唯一可能也無妨):
declare @t table(id int UNIQUE, name varchar(20) NOT NULL);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/412316.html
標籤:
下一篇:如何合并2個JSON字串C#
