OPEN JSON игнорировать регистр при анализе свойств JSON - PullRequest
0 голосов
/ 03 августа 2020

Допустим, есть таблица A со столбцом Information, и данные хранятся в ней в формате JSON. Строка JSON, хранящаяся там, может иметь свойства Comment и Timestamp или свойства comment и timestamp. Примерно так:

[{"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;

Есть ли какие-либо синтаксис, который возвращает оба свойства Comment или comment, игнорируя регистр.

1 Ответ

2 голосов
/ 04 августа 2020

Как объясняется в документации , с явной схемой (предложение 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
...