使用2列中的数据返回SQL Server 2016中的JSON值列表

时间:2019-03-02 16:47:49

标签: sql sql-server-2016

我有一个包含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"} ]

2 个答案:

答案 0 :(得分:0)

在2016年,您不能使用STRING_AGG,但是您可以可以使用久经考验的旧FOR XML PATHSTUFF方法:< / 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中可用。