如何在CASE WHEN的THEN或ELSE块中复用其中定义的值?
如何在CASE WHEN中复用子查询结果
当然可行,你可以通过几种方式实现子查询结果的复用,避免重复执行相同的子查询:
1. 用ANSI标准的公共表达式(CTE)
这是最通用的写法,几乎所有现代数据库(PostgreSQL、MySQL 8.0+、SQL Server、Oracle等)都支持,属于纯标准SQL:
WITH subquery_result AS ( SELECT 1+1 AS value -- 替换成你的真实子查询 ) SELECT CASE WHEN value > 2 THEN value || ' is greater than 2' ELSE value || ' is not greater than 2' END FROM subquery_result;
CTE会先执行一次子查询并存储结果,之后在主查询的CASE逻辑里直接引用即可,不会重复执行子查询。
2. 用FROM子句中的子查询
如果你的数据库不支持CTE(比如老版本MySQL),可以把子查询放到FROM里:
SELECT CASE WHEN value > 2 THEN value || ' is greater than 2' ELSE value || ' is not greater than 2' END FROM ( SELECT 1+1 AS value -- 替换为真实子查询 ) AS sub;
这个写法同样是ANSI标准,兼容性更广,子查询只会执行一次。
3. 数据库特定的变量赋值
部分数据库支持会话或局部变量赋值,比如:
MySQL:
SET @value = (SELECT 1+1); SELECT CASE WHEN @value > 2 THEN @value || ' is greater than 2' ELSE @value || ' is not greater than 2' END;
SQL Server:
DECLARE @value INT; SET @value = (SELECT 1+1); SELECT CASE WHEN @value > 2 THEN CAST(@value AS VARCHAR(10)) + ' is greater than 2' ELSE CAST(@value AS VARCHAR(10)) + ' is not greater than 2' END;
注意这种方式是非标准SQL,不同数据库的语法差异较大,如果需要跨数据库兼容,优先选前两种方法。
内容的提问来源于stack exchange,提问作者hubigabi
相关产品推荐
相关产品推荐

