nok*_*nal 14 sql-server arrays json sql-server-2016
我是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
Run Code Online (Sandbox Code Playgroud)
这将返回一个对象数组:
[{"value":"foo"},{"value":"bar"},{"value":"test"},{"value":"ok"}]
Run Code Online (Sandbox Code Playgroud)
我希望它返回:
["foo","bar","test","ok"]
Run Code Online (Sandbox Code Playgroud)
甚至可以这样做吗?
小智 8
基于 Loui Bao 和 Roman 的回答:
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
Run Code Online (Sandbox Code Playgroud)
这是创建一个简单值的 JSON 有效数组并将其分配给属性 MuhArray。JSON 输出将是:
[{
  MuhArray: ["foo", "bar", "test", "ok"],
  OtherValue: "Value",
  AnotherValue: "AnotherValue"
}]
Run Code Online (Sandbox Code Playgroud)
WhereOtherValue和AnotherValuereceive 表中的任何相应值。通过一些摆弄,您也可以选择不将其构建为选择列表中的子查询,而是作为主查询正文中的简单连接。在我看来,在选择列表中使用子查询可以消除对distinct关键字的需要。
在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
Run Code Online (Sandbox Code Playgroud)
只需将SELECT FOR JSON表达式的结果作为@json参数和要作为第二个参数删除的键的名称.可能是这样的:
select dbo.ufnToRawJsonArray( (SELECT value FROM mytable for json path), 'value')
Run Code Online (Sandbox Code Playgroud)
        在SQL2017中,使用STRING_AGG而不是json。此函数最适合生成以逗号分隔的值列表。
https://docs.microsoft.com/zh-cn/sql/t-sql/functions/string-agg-transact-sql
SELECT town, STRING_AGG (email, ';') AS emails 
FROM dbo.Employee 
GROUP BY town;
Run Code Online (Sandbox Code Playgroud)
        建立在罗马的答案之上:
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
Run Code Online (Sandbox Code Playgroud)
输出:
["foo","bar","test","ok"]
这应该可以帮助您开始。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
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           4092 次  |  
        
|   最近记录:  |