如何在 Azure SQL 中生成 JSON 值数组

How to generate a JSON value array in Azure SQL

DECLARE @segArr NVARCHAR(max)

set @segArr = N'[1,2,3]'

DECLARE @segTb table (
    k int,
    v NVARCHAR(20)
);
insert into @segTb
VALUES
(0, 'a'),
(1, 'b'),
(2, 'c'),
(3, 'd'),
(4, 'e'),
(5, 'f');


select t.v from @segTb t
JOIN openjson(@segArr) a on a.[key] = t.k
for JSON auto;

我有一个简单的 table,它具有类似键值的结构和一个 JSON 数组,它是我想要的值的键列表。

select语句可以创建想要的结果,但是JSON格式不对。它输出一个对象数组。

[
    {
        "v": "a"
    },
    {
        "v": "b"
    },
    {
        "v": "c"
    }
]

但我需要的是一组直接值。

[ "a", "b", "c" ]

您可以使用更传统的字符串操作方法在 Azure SQL 数据库中创建 JSON 数组,例如 STRING_AGG 聚合具有给定分隔符(例如逗号)的字符串和 QUOTENAME 用给定的引号字符包围字符串。一个简单的例子:

SELECT QUOTENAME( STRING_AGG( QUOTENAME(v, '"' ), ',' ), '[' ) AS yourArray
FROM
    (
    SELECT t.v FROM @segTb t
        INNER JOIN OPENJSON(@segArr) a ON a.[key] = t.k
    ) x;

对于您的特定示例,您可以使用 CREATE TYPE 创建一个 user-defined table-type。这样做的好处是您能够向类型添加主键,以保证不会添加重复项,在 运行 时间为优化器提供更多信息,并使用本机关系功能而不是附加功能没有SQL 种能力。一个应该 运行 端到端的简单示例:

IF NOT EXISTS ( SELECT * FROM sys.types st INNER JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N'tvpItems' AND ss.name = N'dbo')
    CREATE TYPE dbo.tvpItems AS TABLE
        (
            k INT PRIMARY KEY
        );
GO

DECLARE @items AS dbo.tvpItems 

INSERT INTO @items VALUES ( 1 ), ( 2 ), ( 3 )

DECLARE @segTb TABLE (
    k INT,
    v NVARCHAR(20)
);

INSERT INTO @segTb
VALUES
    (0, 'a'),
    (1, 'b'),
    (2, 'c'),
    (3, 'd'),
    (4, 'e'),
    (5, 'f');


SELECT t.v 
FROM @segTb t
    INNER JOIN @items i ON i.k = t.k
FOR JSON AUTO;