SQL to JSON - SQL 2016中的值数组对象数组

时间:2016-06-08 17:00:09

标签: sql json sql-server-2016

SQL 2016有一项新功能,可将SQL Server上的数据转换为JSON。我很难将对象数组合成值数组,即

示例 -

CREATE TABLE #temp (item_id VARCHAR(256))

INSERT INTO #temp VALUES ('1234'),('5678'),('7890')

SELECT * FROM #temp

--convert to JSON

SELECT (SELECT item_id 
FROM #temp
FOR JSON PATH,root('ids')) 

结果 -

{
    "ids": [{
        "item_id": "1234"
    },
    {
        "item_id": "5678"
    },
    {
        "item_id": "7890"
    }]
}

但我希望结果为 -

"ids": [
        "1234",
        "5678",
        "7890"
    ]

有人可以帮帮我吗?

6 个答案:

答案 0 :(得分:16)

谢谢!我们发现的灵魂首先是转换为XML -

SELECT  
JSON_QUERY('[' + STUFF(( SELECT ',' + '"' + item_id + '"' 
FROM #temp FOR XML PATH('')),1,1,'') + ']' ) ids  
FOR JSON PATH , WITHOUT_ARRAY_WRAPPER 

答案 1 :(得分:12)

马丁!

我相信这是一种更简单的方法:

    SELECT '"ids": ' + 
    REPLACE( 
      REPLACE( (SELECT item_id FROM #temp FOR JSON AUTO),'{"item_id":','' ),
      '"}','"' )

答案 2 :(得分:6)

declare @temp table (item_id VARCHAR(256))

INSERT INTO @temp VALUES ('123"4'),('5678'),('7890')

SELECT * FROM @temp

--convert to JSON

select 
    json_query(QUOTENAME(STRING_AGG('"' + STRING_ESCAPE(item_id, 'json') + '"', char(44)))) as [json]
from @temp
for json path

当我们想将字符串连接为json数组时:

1)转义字符串 - STRING_ESCAPE

2)用逗号分隔符连接字符串 - STRING_AGG,逗号ascii代码为44

3)在括号中添加引号 - QUOTENAME(不含参数)

4)返回字符串(带有元素数组)作为json - JSON_QUERY

答案 3 :(得分:3)

由于原始值数组是有效的JSON,因此在SQL Server的JSON功能中没有内置用于选择原始值数组的工具。 (如果相反存在这样的功能,我至少在经过相当多的搜索后才能发现它。)

上述方法如上所述。但是当在较大的查询中应用字段时,基元数组被引号括起来。

,例如,

DECLARE @BomTable TABLE (ChildNumber dbo.udt_ConMetPartNumber);
INSERT INTO @BomTable (ChildNumber) VALUES (N'101026'), (N'101027');
SELECT N'"Children": ' + REPLACE(REPLACE((SELECT ChildNumber FROM @BomTable FOR JSON PATH), N'{"ChildNumber":', N''), '"}','');

通过制作:

"Children": ["101026,"101027]

但是,按照上面的方法,这个:

SELECT
    p.PartNumber,
    p.Description,
    REPLACE(REPLACE((SELECT
                        ChildNumber
                     FROM
                        Part.BillOfMaterials
                     WHERE
                        ParentNumber = p.PartNumber
                     ORDER BY
                        ChildNumber
                    FOR
                     JSON AUTO
                    ), N'{"ChildNumber":', N''), '"}', '"') AS [Children]
FROM
    Part.Parts AS p
WHERE
    p.PartNumber = N'104444'
FOR
    JSON PATH

产地:

[
    {
        "PartNumber": "104444",
        "Description": "ASSY HUB           R-SER  DRIV HP10  ABS",
        "Children": "[\"101026\",\"101027\",\"102291\",\"103430\",\"103705\",\"104103\"]"
    }
]

Children 数组包装为字符串。

答案 4 :(得分:1)

这些解决方案中的大部分实际上都是创建一个表示数组内容的CSV,然后将该CSV放入最终的JSON格式。这是我使用的,以避免XML:

DECLARE @tmp NVARCHAR(MAX) = ''

SELECT @tmp = @tmp + '"' + [item_id] + '",'
FROM #temp -- Defined and populated in the original question

SELECT [ids] = JSON_QUERY((
    SELECT CASE
        WHEN @tmp IS NULL THEN '[]'
        ELSE '[' + SUBSTRING(@tmp, 0, LEN(@tmp)) + ']'
        END
    ))
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

答案 5 :(得分:0)

此版本(在其他版本的基础上):

  • 正确转义特殊的JSON字符(例如引号)
  • 返回无数据的空数组[]

需要SQL 2016或更高版本(由于STRING_ESCAPE):

SELECT 
   CONCAT('[', '"' +
        (SELECT STRING_AGG(STRING_ESCAPE(item_id, 'json'), '","') 
         FROM #temp) 
    + '"', ']')