sql-server - 有没有更好的方法来做这个查询
问题描述
我有一个表格,我将 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
一次检查并将结果用于其余选择吗?任何帮助将不胜感激。
解决方案
我想你可以把它缩小到这个(它更简洁一点):
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);
推荐阅读
- flutter - Flutter package Chewie:如何知道视频控制器将第一帧放在屏幕上而不播放视频?
- mobx - 如何将 Mobx 用于本地存储,将存储传递给组件
- python - tensorflow 2.0 自定义训练循环的学习率
- .net - 如何在 .NET 核心项目中制作解决方案级别的 nuget 包文件
- tensorflow - 如何为未知批量大小的输入创建可训练的线性层?(Keras/张量流)
- r - 回归方程中的rollapply问题
- visual-studio-code - Eslint/更漂亮的 javascript 文件
- javascript - 使制表器下载中的链接可点击
- r - 删除数据框中的行时保留名称
- core-data - iOS 13 上的 Notes 应用程序如何共享整个文件夹?New CloudKit Container 大概是如何使用的?