我有一个包含2列的数据库
A B
-- --
X 1995
Y 2005
C 1962
D 2003
我正在尝试创建一条SQL语句,该语句将使用逗号分隔的值的字符串,并在B中返回值的json列表,其中字符串中的任何值都在A中
因此,如果逗号分隔的字符串为'X,C'
,则json列表将为[1995,1962]
我一直在使用json路径尝试此操作,但是我无法完全按照自己的意愿获得它,而且我一直在转动车轮太久了
这是我尝试过的:
Select mt.B as json_list_b_values
From [dbo].[myTable] mt
Where mt.A in (Select value From String_Split('X,C', ',')) for json path
这是输出:
[ {"json_list_b_values":"1995"}, {"json_list_b_values":"1962"} ]
答案 0 :(得分:0)
在2016年,您不能使用STRING_AGG
,但是您可以可以使用久经考验的旧FOR XML PATH
和STUFF
方法:< / p>
DECLARE @list varchar(8000) = 'X,C';
WITH VTE AS(
SELECT *
FROM(VALUES('X',1995),
('Y',2005),
('C',1962),
('D',2003)) V(A,B))
SELECT '[' + STUFF((SELECT CONCAT(',',V.B)
FROM VTE V
CROSS APPLY STRING_SPLIT(@list,',') SS
WHERE SS.[value] = V.A
FOR XML PATH('')),1,1,'') + ']';
答案 1 :(得分:-1)
我不是SQL专家。所以,请忍受我。
第1步-处理CSV输入
您已经通过使用 IN 子句进行了此操作。我会将这些结果存储在表变量中
第2步-将查询结果转换为简单的JSON数组
我可以想到函数 STRING_AGG()。这会将行连接成一个平面字符串。
例如将“名字”列连接到以逗号分隔的字符串中
SELECT STRING_AGG ( ISNULL(FirstName,'N/A'), ',') AS csv
FROM Person.Person;
将产生以下内容
John,N/A,Mike,Peter,N/A,N/A,Alice,Bob
基于您的示例的代码段
我正在使用表变量 @ result1 来保存第1步中的结果。
SELECT '[ "' + string_agg( json_list_b_values, '", "') + '" ]' FROM @result1
STRING_AGG()的MSDN参考
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017
更正
函数 STRING_AGG()在SQL 2017中可用。