SQL Server:如何消除CASE表达式中的重复查询语句
避免重复执行子查询的几种实现方式
当然有办法啦!你完全不用重复执行那个子查询,下面给你几个简洁高效的方案,都能满足「当人口值为0时返回1,否则返回原人口值」的需求:
1. 使用CTE(公共表表达式)
CTE可以帮你先把人口值一次性查询出来,后续直接引用这个临时结果,不会重复执行子查询:
WITH MexicoPopulation AS ( SELECT POPULATION FROM MEXICO ) SELECT CASE WHEN POPULATION = 0 THEN 1 ELSE POPULATION END AS AdjustedPopulation FROM MexicoPopulation;
2. 使用派生表
和CTE思路类似,把子查询放在FROM子句里作为临时表,同样只执行一次查询:
SELECT CASE WHEN POPULATION = 0 THEN 1 ELSE POPULATION END AS AdjustedPopulation FROM ( SELECT POPULATION FROM MEXICO ) AS SubQuery;
3. 用ISNULL + NULLIF的简洁组合
如果追求代码简洁,这个组合堪称最佳选择,一行代码搞定,而且只查询一次POPULATION字段:
SELECT ISNULL(NULLIF(POPULATION, 0), 1) AS AdjustedPopulation FROM MEXICO;
原理很简单:NULLIF(POPULATION, 0)会把等于0的人口值转换成NULL,接着ISNULL把这个NULL替换成1,完美匹配你的需求。
这些方法都能保证子查询只执行一次,尤其是当你的实际查询逻辑更复杂或者表数据量较大时,能明显提升查询性能。
内容的提问来源于stack exchange,提问作者Zion Lima
相关产品推荐
相关产品推荐

