Sql server 有没有更好的方法来执行此查询
我有一个表,将Json数据保存在Sql server 有没有更好的方法来执行此查询,sql-server,sql-optimization,Sql Server,Sql Optimization,我有一个表,将Json数据保存在RelatedObject列下。表结构如下: +------+------------+-----------------+----------------------+ | [Id] | [ActionId] | [RelatedObject] | [InitiatedTimeStamp] | +------+------------+-----------------+----------------------+ 我存储了两种不同类型的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')是否为空,然后将结果用于其余的选择吗?我们将非常感谢您的帮助。我想您可以将其缩减为空(更简洁一点):