我是SQL Server中的JSON新手,无法弄清楚如何返回一个简单的字符串数组:
DECLARE @T TABLE ([value] NVARCHAR(MAX))
INSERT INTO @T ([value]) VALUES ('foo')
INSERT INTO @T ([value]) VALUES ('bar')
INSERT INTO @T ([value]) VALUES ('test')
INSERT INTO @T ([value]) VALUES ('ok')
SELECT [value]
FROM @T
FOR JSON PATH
这将返回一个对象数组:
[{"value":"foo"},{"value":"bar"},{"value":"test"},{"value":"ok"}]
我希望它返回:
["foo","bar","test","ok"]
甚至可以这样做吗?
答案 0 :(得分:6)
在AdventureWorks 2016 CTP3 JSON示例中,您可以找到一个可以清除键:值对的数组并创建数组od值的函数:
DROP FUNCTION IF EXISTS dbo.ufnToRawJsonArray
GO
CREATE FUNCTION
[dbo].[ufnToRawJsonArray](@json nvarchar(max), @key nvarchar(400)) returns nvarchar(max)
AS BEGIN
declare @new nvarchar(max) = replace(@json, CONCAT('},{"', @key,'":'),',')
return '[' + substring(@new, 1 + (LEN(@key)+5), LEN(@new) -2 - (LEN(@key)+5)) + ']'
END
只需将SELECT FOR JSON表达式的结果作为@json参数提供,并将要删除的键的名称作为第二个参数提供。可能类似于:
select dbo.ufnToRawJsonArray( (SELECT value FROM mytable for json path), 'value')
答案 1 :(得分:3)
在SQL2017中,使用STRING_AGG代替json。此函数最适合生成以逗号分隔的值列表。
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql
SELECT town, STRING_AGG (email, ';') AS emails
FROM dbo.Employee
GROUP BY town;
答案 2 :(得分:1)
这应该让你开始。 2016有几种使用JSON的方法。此方法定义JSON字符串,从中提取值,然后使用XML技巧将多行放入一行。
DECLARE @T TABLE ([value] NVARCHAR(MAX))
INSERT INTO @T ([value])
VALUES ('foo')
INSERT INTO @T ([value])
VALUES ('bar')
INSERT INTO @T ([value])
VALUES ('test')
INSERT INTO @T ([value])
VALUES ('ok')
DECLARE @JSON NVARCHAR(MAX) = (
SELECT *
FROM @T
FOR JSON PATH
);
WITH cte
AS (
SELECT *
FROM OPENJSON(@json) WITH (NAME VARCHAR(10) '$.value')
)
SELECT QUOTENAME(left(names, LEN(names) - 1) )AS names
FROM (
SELECT DISTINCT (
SELECT QUOTENAME(NAME,'"') + ',' AS [text()]
FROM cte
FOR XML PATH('')
) names
FROM cte
) x
答案 3 :(得分:1)
以罗曼的答案为基础:
declare @t table ([value] nvarchar(max))
insert into @t ([value]) values ('foo')
insert into @t ([value]) values ('bar')
insert into @t ([value]) values ('test')
insert into @t ([value]) values ('ok')
select concat('[', string_agg(concat('"', [value], '"'), ','), ']')
from @t
输出:
["foo","bar","test","ok"]
答案 4 :(得分:1)
建立在路易·鲍和罗曼的答案上:
declare @t table ([value] nvarchar(max))
insert into @t ([value]) values ('foo')
insert into @t ([value]) values ('bar')
insert into @t ([value]) values ('test')
insert into @t ([value]) values ('ok')
SELECT
JSON_QUERY((SELECT CONCAT('["',STRING_AGG([value], '","'),'"]') FROM @t)) As MuhArray
OtherValue,
AnotherValue
FROM MyTableOValues
FOR JSON PATH
这将创建一个简单值的JSON有效数组,并将其分配给属性MuhArray。 JSON输出如下:
[{
MuhArray: ["foo", "bar", "test", "ok"],
OtherValue: "Value",
AnotherValue: "AnotherValue"
}]
OtherValue
和AnotherValue
收到表中相应值的位置。经过一些摆弄,您还可以选择不将其构建为选择列表中的子查询,而是构建为主查询主体中的简单联接。我认为,在选择列表中使用子查询可以消除对distinct
关键字的需求。
答案 5 :(得分:0)
将以下代码与Sql Server 2016中的任何版本一起使用
declare @t table ([value] nvarchar(max))
insert into @t ([value]) values ('foo')
insert into @t ([value]) values ('bar')
insert into @t ([value]) values ('test')
insert into @t ([value]) values ('ok')
DECLARE @values nvarchar(max) = N'[]';
SELECT @values = JSON_MODIFY(@values,'append $',[value])
FROM @t SELECT @values
答案 6 :(得分:0)
另一种解决方案
DECLARE @T TABLE ([value] NVARCHAR(MAX))
INSERT INTO @T ([value]) VALUES ('foo')
INSERT INTO @T ([value]) VALUES ('bar')
INSERT INTO @T ([value]) VALUES ('test')
INSERT INTO @T ([value]) VALUES ('ok')
SELECT JSON_QUERY('[' + STUFF((SELECT ',"' + [value] + '"' from @T FOR XML PATH('')), 1, 1, '')+']')
返回:
["foo","bar","test","ok"]