【问题标题】:Get multiple rows using FOR JSON clause使用 FOR JSON 子句获取多行
【发布时间】:2022-01-15 09:42:27
【问题描述】:

使用 PostgreSQL,我可以拥有多行 json 对象。

select (select ROW_TO_JSON(_) from (select c.name, c.age) as _) as jsonresult from employee as c

这给了我这个结果:

{"age":65,"name":"NAME"}
{"age":21,"name":"SURNAME"}

但是在 SqlServer 中,当我使用 FOR JSON AUTO 子句时,它给了我一个 json 对象数组而不是多行。

select c.name, c.age from customer c FOR JSON AUTO

[{"age":65,"name":"NAME"},{"age":21,"name":"SURNAME"}]

如何在SqlServer中得到相同的结果格式?

【问题讨论】:

  • SQL Server 2016 CTP3.2 添加了without_array_wrapper...示例:select top 5 (select a.* for json path, without_array_wrapper) from sys.objects a

标签: sql-server sql-server-2016


【解决方案1】:

通过在每个单独的行中构造单独的 JSON:

SELECT (SELECT [age], [name] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)
FROM customer

有一种替代形式不需要您知道表结构(但性能可能更差,因为它可能会生成较大的中间 JSON):

SELECT [value] FROM OPENJSON(
    (SELECT * FROM customer FOR JSON PATH)
)

【讨论】:

  • @Mathew:是的,请参阅更新后的问题。我不知道如何做到这一点会有很好的表现;如果这是一个问题,请提出一个单独的问题。 (或者,您知道,只需写出列,建议不要使用 SELECT *。)
【解决方案2】:

无结构性能更好

SELECT c.id, jdata.*
FROM customer c
  cross apply 
    (SELECT * FROM customer jc where jc.id = c.id FOR JSON PATH , WITHOUT_ARRAY_WRAPPER) jdata (jdata)

【讨论】:

  • 非常感谢。其他答案对我不起作用
【解决方案3】:

与 Barak Yellin 相同,但更懒惰:

1-创建这个过程

CREATE PROC PRC_SELECT_JSON(@TBL VARCHAR(100), @COLS VARCHAR(1000)='D.*') AS BEGIN
EXEC('
SELECT X.O FROM ' + @TBL + ' D
CROSS APPLY (
    SELECT ' + @COLS + '
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) X (O)
')
END

2-可以使用所有列或特定列:

CREATE TABLE #TEST ( X INT, Y VARCHAR(10), Z DATE )
INSERT #TEST VALUES (123, 'TEST1', GETDATE())
INSERT #TEST VALUES (124, 'TEST2', GETDATE())

EXEC PRC_SELECT_JSON #TEST

EXEC PRC_SELECT_JSON #TEST, 'X, Y'

如果您使用的是 PHP,请在第一行添加 SET NOCOUNT ON; (why?)。

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多