Есть ли лучший способ сделать этот запрос - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть таблица, в которой я храню данные Json в столбце RelatedObject.Структура таблицы следующая:

+------+------------+-----------------+----------------------+
| [Id] | [ActionId] | [RelatedObject] | [InitiatedTimeStamp] |
+------+------------+-----------------+----------------------+

Я храню два разных типа объекта Json.Примерно так:

{
    "firstName": "FName",
    "lastName": "LName",
    "emailAddress": "xxx@gmail.com",    
    "contactPref": {
        "lm_contclassne": "on",
        "lm_contclassneindustrial": "on",
        "lm_contclassneconstruction": "on"
     }
}

Второй вид - это подмножество первого.Примерно так:

{
  "lm_contclassne": "on",
  "lm_contclassneindustrial": "on",
  "lm_contclassneconstruction": "on"
}

Теперь проблема заключается в выборе пути Json (в некоторых случаях свойства lm_contclassne, а для других его contactPref.lm_contclassne) для запроса.Вот как я это делаю.

SELECT [Id],
  [ActionId],
  [InitiatedTimeStamp],
  JSON_VALUE(RelatedObject, IIF(JSON_QUERY(RelatedObject, '$.contactPref') IS NULL, '$.lm_contclassne', '$.contactPref.lm_contclassne')) lm_contclassne,
  JSON_VALUE(RelatedObject, IIF(JSON_QUERY(RelatedObject, '$.contactPref') IS NULL, '$.lm_contclassneindustrial', '$.contactPref.lm_contclassneindustrial')) lm_contclassneindustrial,
  JSON_VALUE(RelatedObject, IIF(JSON_QUERY(RelatedObject, '$.contactPref') IS NULL, '$.lm_contclassneconstruction', '$.contactPref.lm_contclassneconstruction')) lm_contclassneconstruction
FROM [SaveStatus]

Работает нормально.

У меня такой вопрос, могу ли я оптимизировать запрос?Вы можете видеть, что я наложил одно и то же условие на все свойства Json.Могу ли я сделать проверку IIF(JSON_QUERY(RelatedObject, '$.contactPref') IS NULL один раз и использовать результат для остальной части выбора?Любая помощь будет оценена.

1 Ответ

0 голосов
/ 22 февраля 2019

Вы могли бы сократить это до этого, я полагаю (это немного более кратко):

SELECT [Id],
       [ActionId],
       [InitiatedTimeStamp],
       JSON_VALUE(RelatedObject, IIF(RO.cP IS NULL, '$.lm_contclassne', '$.contactPref.lm_contclassne')) lm_contclassne,
       JSON_VALUE(RelatedObject, IIF(RO.cP IS NULL, '$.lm_contclassneindustrial', '$.contactPref.lm_contclassneindustrial')) lm_contclassneindustrial,
       JSON_VALUE(RelatedObject, IIF(RO.cP IS NULL, '$.lm_contclassneconstruction', '$.contactPref.lm_contclassneconstruction')) lm_contclassneconstruction
FROM [SaveStatus] SS
     CROSS APPLY(VALUES(JSON_QUERY(RelatedObject, '$.contactPref'))) RO(cP);
...