能否基于两个CASE表达式的结果创建新的CASE表达式?
可行,但不能直接引用别名,需用以下方式实现
你不能在同一条SELECT语句的后续表达式里直接引用前面CASE的别名(比如result1),因为SQL的执行顺序是先处理FROM和WHERE,再处理SELECT里的列,别名要到后续步骤才生效。不过可以通过以下几种方式实现需求:
方法1:使用子查询或CTE
先把原有的两个CASE结果作为子查询/CTE的列,给它们起别名,再在外层基于这些别名构建新的CASE:
WITH base_data AS ( SELECT CASE -- result#1 WHEN .. then 'a' WHEN .. then 'b' END AS result1, CASE -- result#2 WHEN .. then 'c' WHEN .. then 'd' END AS result2 FROM table1 ) SELECT result1, result2, CASE WHEN result1 IS NOT NULL AND result2 IS NOT NULL THEN '...' ELSE NULL END AS new_result FROM base_data;
方法2:重复原CASE表达式
直接把两个原CASE的逻辑复制到新CASE的条件中,虽然代码有冗余,但写法简单直接:
SELECT CASE -- result#1 WHEN .. then 'a' WHEN .. then 'b' END AS result1, CASE -- result#2 WHEN .. then 'c' WHEN .. then 'd' END AS result2, CASE WHEN (CASE WHEN .. then 'a' WHEN .. then 'b' END) IS NOT NULL AND (CASE WHEN .. then 'c' WHEN .. then 'd' END) IS NOT NULL THEN '...' ELSE NULL END AS new_result FROM table1;
方法3:使用CROSS APPLY(适用于SQL Server、PostgreSQL等)
通过CROSS APPLY将原CASE的结果封装成临时列,之后可以直接引用别名:
SELECT t.result1, t.result2, CASE WHEN t.result1 IS NOT NULL AND t.result2 IS NOT NULL THEN '...' ELSE NULL END AS new_result FROM table1 CROSS APPLY ( SELECT CASE WHEN .. then 'a' WHEN .. then 'b' END AS result1, CASE WHEN .. then 'c' WHEN .. then 'd' END AS result2 ) t;
内容的提问来源于stack exchange,提问作者Blankman
相关产品推荐
相关产品推荐

