1

I am trying to parse JSON data in SQL Server. The column headers are mixed case. Is there a way to convert it to upper or lower case. Below is the code:

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',)

For example: In some case '$."content-Type"' is '$."Content-Type"'. How to make it case insensitive.

Ravi 1001
  • 25
  • 4

1 Answers1

0
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',)
John Cappelletti
  • 79,615
  • 7
  • 44
  • 66
  • It works. Thanks :). Is there a way to write the query more efficiently rather than using replace again and again – Ravi 1001 Mar 02 '21 at 05:17
  • Happy to help. Perhaps a Select * From OpenJSON ... in concert with a PIVOT or condtional aggregation, but I can't imagine it being more performant. – John Cappelletti Mar 02 '21 at 16:43