【问题标题】:Can you mix string and object outputs in SQL JSON?您可以在 SQL JSON 中混合字符串和对象输出吗?
【发布时间】:2017-12-15 13:43:44
【问题描述】:

我正在尝试从我的 SQL 数据库(兼容级别 140)构建一个 JSON 序列化的键/值对项列表。诀窍是值可以是任何值:数字、字符串、null 或其他 JSON 对象。

它应该看起来像这样:

[{"key":"key1","value":"A String"},{"key":"key2","value":{"InnerKey":"InnerValue"}}]

但是,SQL 似乎迫使我选择 either 一个字符串 一个对象。

SELECT
       [key] = kvp.[key],
       [value] = CASE
              WHEN ISJSON(kvp.[value]) = 1 THEN JSON_QUERY(kvp.[value])
              ELSE '"' + kvp.[value] + '"'  -- See note below
              END
FROM (VALUES
        ('key1', 'This value is a string')
       ,('key2', '{"description":"This value is an object"}')
       ,('key3', '["This","value","is","an","array","of","strings"]')
       ,('key4', NULL)

       -- Without these lines, the above 4 work fine; with either of them, even those 4 are broken
       --,('key5', (SELECT [description] = 'This value is a dynamic object' FOR JSON PATH, WITHOUT_ARRAY_WRAPPER))
       --,('key6', JSON_QUERY((SELECT [description] = 'This value is a dynamic object' FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)))
) AS kvp([key], [value])
FOR JSON PATH

我是在尝试做一些 SQL 不支持的事情,还是我只是缺少正确的语法来完成这项工作?

*请注意,添加双引号似乎没有必要。但没有这些,SQL 无法包装字符串并生成错误的 JSON:

[{"key":"key1","value":This value is a string},...

【问题讨论】:

    标签: json sql-server json-query


    【解决方案1】:

    如果您的查询被修改为这个,它可以工作:

    SELECT
       [key] = kvp.[key],
       [value] = ISNULL(
              JSON_QUERY(CASE WHEN ISJSON(kvp.[value]) = 1 THEN kvp.[value] END),
              '"' + STRING_ESCAPE(kvp.[value], 'json') + '"'
       )
    FROM (VALUES
       ('key1', 'This value is a "string"')
       ,('key2', '{"description":"This value is an object"}')
       ,('key3', '["This","value","is","an","array","of","strings"]')
       ,('key4', NULL)
    
       -- These now work
       ,('key5', (SELECT [description] = 'This value is a dynamic object' FOR JSON PATH, WITHOUT_ARRAY_WRAPPER))
       ,('key6', JSON_QUERY((SELECT [description] = 'This value is a dynamic object' FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)))
    ) AS kvp([key], [value])
    FOR JSON PATH, INCLUDE_NULL_VALUES
    

    当然,如果valueint,这还不够。另外,我真的无法解释为什么你的不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2018-03-26
      • 2023-04-06
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多