Sql server 有没有更好的方法来执行此查询

Sql server 有没有更好的方法来执行此查询,sql-server,sql-optimization,Sql Server,Sql Optimization,我有一个表,将Json数据保存在RelatedObject列下。表结构如下: +------+------------+-----------------+----------------------+ | [Id] | [ActionId] | [RelatedObject] | [InitiatedTimeStamp] | +------+------------+-----------------+----------------------+ 我存储了两种不同类型的Json对象。一个是

我有一个表,将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"
}
第二类是第一类的子集。像这样的东西

{
    "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_查询(RelatedObject,$.contactPref')是否为空,然后将结果用于其余的选择吗?我们将非常感谢您的帮助。

我想您可以将其缩减为空(更简洁一点):