我需要生成一个包含两个不同对象的JSON数组:

[
    {
        "command": "setcontext",
        "recordtype": "client",
        "recordid": 1030
    },
    {
        "command": "gotodq",
        "usercode": "react_webuser_debtor_details"
    }
]

我可以使用以下命令分别生成这两个对象:

SELECT 
    'setcontext' AS command, 'client' AS recordtype, 1030 AS recordid 
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

SELECT 
    'gotodq' AS command, 'react_webuser_debtor_details' AS usercode 
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

但我不知道如何将这两条语句合并为一条来得到array.

显然,我可以将两者连接为附加数组标记的字符串,但我很好奇JSON的"纯"SQL解决方案会是什么样子……

推荐答案

在SQL Server 2022和Azure SQL中,您可以使用JSON_ARRAYJSON_OBJECT函数

SELECT JSON_ARRAY(
    JSON_OBJECT(
      'command':'setcontext',
      'recordtype':'client',
      'recordid':1030
    ),
    JSON_OBJECT(
      'command':'gotodq',
      'usercode':'react_webuser_debtor_details'
    )
);

在较旧的版本中,您不能使用这些.同样,JSON_ARRAY_AGG也不能使用.

您可以将它们连接在一起.(如果您的项目数未定义,请使用STRING_AGG.)

SELECT '[' + (
    SELECT 
      'setcontext' AS command, 'client' AS recordtype, 1030 AS recordid 
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
  ) + ',' + (
    SELECT 
      'gotodq' AS command, 'react_webuser_debtor_details' AS usercode 
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
  );

或者,您可以将其设置为UNION ALL,但是具有相同名称的列需要具有相同的数据类型.

SELECT 
  'setcontext' AS command,
  'client' AS recordtype,
  1030 AS recordid,
  NULL AS usercode

UNION ALL

SELECT 
    'gotodq',
    NULL,
    NULL,
    'react_webuser_debtor_details'

FOR JSON PATH;

db<>fiddle

Json相关问答推荐

使用相同的密钥值来命名Json并使用Jolt重命名密钥

如何在Power BI中集成API和JSON数据后将数据转换为表?

无法从JSON解析ZonedDateTime,但可以使用格式化程序很好地解析

如何对未知/变量键的字典进行编码?

带有 API 测试的 Typescript JSON 模式验证

使用 JQ 获取 JSON 中的替代元素(输出:JSON 对象)

jq json - 按键名 Select

如何在 Django 的模板语言中获取 json 键和值?

使用 boost 属性树读取 int 数组

Jackson 的@JsonView、@JsonFilter 和 Spring

哪个更好:Json 或 XML (PHP)

应该使用什么标头将 GZIP 压缩 JSON 从 Android 客户端发送到服务器?

在 JSON 反序列化期间没有为System.String类型定义无参数构造函数

使用 JSON 的 javascript 深拷贝

无法将空值放入 JSON 对象

如何从 JSON 响应中提取单个值?

如何对 jq 中的 map 数组中的值求和?

Volley JsonObjectRequest Post 参数不再起作用

我如何反序列化以杰克逊为单位的时间戳?

Javascript对象和JSON对象有什么区别