首页 > 解决方案 > 有没有更好的方法来做这个查询

问题描述

我有一个表格,我将 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一次检查并将结果用于其余选择吗?任何帮助将不胜感激。

标签: sql-serversql-optimization

解决方案


我想你可以把它缩小到这个(它更简洁一点):

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);

推荐阅读