如何强制MSSQL先过滤合法JSON行再执行JSON_VALUE查询?
解决MSSQL中强制WHERE子句条件执行顺序的问题
最优方案:使用TRY_JSON_VALUE函数
SQL Server 2016及以上版本提供了TRY_JSON_VALUE,它和JSON_VALUE功能一致,但遇到非法JSON时会返回NULL而非抛出错误,完全适配你的需求,写法简洁且不需要依赖执行顺序:
SELECT *, ISJSON(Data) p FROM dbo.Table WHERE ISJSON(Data) = 1 AND TRY_JSON_VALUE(Data, '$.F1.F2') IS NOT NULL;
低版本兼容方案:强制子查询物化
如果你的SQL Server版本不支持TRY_JSON_VALUE,可以通过在子查询中添加TOP (9223372036854775807)(SQL Server支持的最大整数)来强制优化器先执行过滤合法JSON的逻辑,避免提前解析非法JSON:
SELECT t.*, ISJSON(t.Data) p FROM ( SELECT TOP (9223372036854775807) * FROM dbo.Table WHERE ISJSON(Data) = 1 ) t WHERE JSON_VALUE(t.Data, '$.F1.F2') IS NOT NULL;
TOP的最大数值不会过滤任何数据,但会让优化器将子查询视为需要先物化的结果集,确保ISJSON过滤先执行。
备选方案:使用OPTION (FORCE ORDER)强制执行顺序
你也可以用CTE配合OPTION (FORCE ORDER)来强制查询计划按照你编写的逻辑顺序执行,但这个选项会锁定整个查询的执行顺序,可能影响其他部分的查询性能,需根据实际场景评估后使用:
WITH FilteredJSON AS ( SELECT * FROM dbo.Table WHERE ISJSON(Data) = 1 ) SELECT *, ISJSON(Data) p FROM FilteredJSON WHERE JSON_VALUE(Data, '$.F1.F2') IS NOT NULL OPTION (FORCE ORDER);
内容的提问来源于stack exchange,提问作者mordechai
相关产品推荐
相关产品推荐

