如何在 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;
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;