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

Posted

技术标签:

【中文标题】如何使用 OpenJson 将 JSON 列标题转换为小写【英文标题】:How to convert JSON column headers to lower case with OpenJson 【发布时间】:2021-03-02 02:33:45 【问题描述】:

我正在尝试在 SQL Server 中解析 JSON 数据。列标题是大小写混合的。有没有办法将其转换为大写或小写。下面是代码:

SELECT  
pr.AuditEvent_Id as [AuditEvent_HttpHeaders_Id]
  ,[AuditEvent_HttpHeaders_ContentType]
  ,[AuditEvent_HttpHeaders_Accept]
  ,[AuditEvent_HttpHeaders_AcceptEncoding]
  ,[AuditEvent_HttpHeaders_AcceptLanguage]
  ,[AuditEvent_HttpHeaders_Authorization]
  ,[AuditEvent_HttpHeaders_Host]
  ,[AuditEvent_HttpHeaders_Referer]
  ,[AuditEvent_HttpHeaders_UserAgent]
  ,[AuditEvent_HttpHeaders_Origin]
FROM dbo.Audit_Resource pr
CROSS APPLY OpenJson(pr.HttpHeaders) WITH (
    [AuditEvent_HttpHeaders_ContentType] varchar(255) '$."content-Type"',
    [AuditEvent_HttpHeaders_Accept] varchar(255) '$.accept',
    [AuditEvent_HttpHeaders_AcceptEncoding] varchar(255) '$."accept-Encoding"',
    [AuditEvent_HttpHeaders_AcceptLanguage] varchar(255) '$."accept-Language"',
    [AuditEvent_HttpHeaders_Authorization] varchar(255) '$.authorization',
    [AuditEvent_HttpHeaders_Host] varchar(255) '$.host',
    [AuditEvent_HttpHeaders_Referer] varchar(255) '$.referer',
    [AuditEvent_HttpHeaders_UserAgent] varchar(255) '$."user-Agent"',
    [AuditEvent_HttpHeaders_Origin] varchar(255) '$.origin',)

例如:在某些情况下,'$."content-Type"' 是 '$."Content-Type"'。如何使它不区分大小写。

【问题讨论】:

JSON 在设计上是区分大小写的。也许您可以插入一个额外的 CROSS APPLY 并通过一系列替换将所需的 JSON 键转换为小写 @JohnCappelletti 能否请您添加一个示例 【参考方案1】:
SELECT  
pr.AuditEvent_Id as [AuditEvent_HttpHeaders_Id]
  ,[AuditEvent_HttpHeaders_ContentType]
  ,[AuditEvent_HttpHeaders_Accept]
  ,[AuditEvent_HttpHeaders_AcceptEncoding]
  ,[AuditEvent_HttpHeaders_AcceptLanguage]
  ,[AuditEvent_HttpHeaders_Authorization]
  ,[AuditEvent_HttpHeaders_Host]
  ,[AuditEvent_HttpHeaders_Referer]
  ,[AuditEvent_HttpHeaders_UserAgent]
  ,[AuditEvent_HttpHeaders_Origin]
FROM dbo.Audit_Resource pr
CROSS APPLY ( values ( replace(
                       replace(
                       replace(
                       replace(pr.HttpHeaders,'Content-Type','content-type')
                       ,'Accept','accept')
                       ,'accept-Encoding','accept-encoding')
                       ,'accept-Language','accept-language')  -- ... Other Keys
                     ) )J(S)
CROSS APPLY OpenJson(J.S) WITH (
    [AuditEvent_HttpHeaders_ContentType] varchar(255) '$."content-Type"',
    [AuditEvent_HttpHeaders_Accept] varchar(255) '$.accept',
    [AuditEvent_HttpHeaders_AcceptEncoding] varchar(255) '$."accept-Encoding"',
    [AuditEvent_HttpHeaders_AcceptLanguage] varchar(255) '$."accept-Language"',
    [AuditEvent_HttpHeaders_Authorization] varchar(255) '$.authorization',
    [AuditEvent_HttpHeaders_Host] varchar(255) '$.host',
    [AuditEvent_HttpHeaders_Referer] varchar(255) '$.referer',
    [AuditEvent_HttpHeaders_UserAgent] varchar(255) '$."user-Agent"',
    [AuditEvent_HttpHeaders_Origin] varchar(255) '$.origin',)

【讨论】:

它有效。谢谢 :)。有没有办法更有效地编写查询而不是一次又一次地使用替换 乐于助人。可能是 Select * From OpenJSON ... 与 PIVOT 或条件聚合相结合,但我无法想象它的性能更高。

以上是关于如何使用 OpenJson 将 JSON 列标题转换为小写的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 openjson 读取存储在 SQL Server 中的 Json 列下方?

使用 OPENJSON 将 JSON 数组解析为表

OPENJSON 将值列转换为多行不起作用

OpenJson 使用通配符

OPENJSON 与 NULL 值交叉应用 (SQL)

使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016