OPENJSON 在解析 JSON 属性时忽略大小写

Posted

技术标签:

【中文标题】OPENJSON 在解析 JSON 属性时忽略大小写【英文标题】:OPENJSON to ignore case when parsing JSON properties 【发布时间】:2020-08-03 17:39:53 【问题描述】:

假设有一个表 A,其列 Information,数据以 JSON 格式存储在那里。存储在那里的 JSON 字符串可能具有属性 CommentTimestamp 或属性 commenttimestamp。像这样:

["Timestamp":"2018-04-11 18:14:59.9708","Comment":"first comment"]
["timestamp":"2017-04-11 18:14:59.9708","comment":"second comment"]
["Timestamp":"2019-04-11 18:14:59.9708","Comment":"third comment", "timestamp":"2017-04-11 18:14:59.9708","comment":"last comment"]

下面的脚本只解析大写属性的 JSON 字符串,对于小写的 JSON 字符串会抛出错误。

Select jsonInfo.*
From OPENJSON(@Information, N'$')
    with(
        Comment nvarchar(max) N'$.Comment',
        TimeStamp datetime '$.Timestamp'
    ) as jsonInfo;

是否有任何语法通过忽略大小写返回 Commentcomment 属性。

【问题讨论】:

Is there a way to query JSON column in SQL Server ignoring capitalization of keys? 我一直在寻找其他方法,但还没有成功。我决定单独捕获所有这些 JSON 属性,然后使用联合。 【参考方案1】:

正如documentation 中所述,使用显式架构(WITH 子句),OPENJSON() 将输入 JSON 表达式中的键与 WITH 子句中的列名匹配,并且匹配区分大小写。但是,作为一种可能的解决方法,您可以尝试将OPENJSON() 与默认架构和条件聚合一起使用:

声明:

DECLARE @information nvarchar(max) = N'[
   "Timestamp":"2019-04-11 18:14:59.9708","Comment":"third comment", 
   "timestamp":"2017-04-11 18:14:59.9708","comment":"last comment"
]'

SELECT 
   MAX(CASE WHEN LOWER(j2.[key]) = N'timestamp' THEN j2.[value] END) AS [TimeStamp],
   MAX(CASE WHEN LOWER(j2.[key]) = N'comment' THEN j2.[value] END) AS [Comment]
FROM OPENJSON(@information, '$') j1
CROSS APPLY OPENJSON(j1.[value]) j2
GROUP BY j1.[key]

结果:

TimeStamp                   Comment
-----------------------------------------
2019-04-11 18:14:59.9708    third comment
2017-04-11 18:14:59.9708    last comment

【讨论】:

以上是关于OPENJSON 在解析 JSON 属性时忽略大小写的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OpenJson 将 JSON 列标题转换为小写

在存储过程中多次访问 OPENJSON 解析 JSON?

使用 OPENJSON 跳过 OBJECTS 解析 JSON SQL

SQL OPENJSON - 解析 JSON 数组

使用 OPENJSON 将 JSON 数组解析为表

路径包含有趣字符时的 TSQL OPENJSON