如何引用拼接操作生成的列别名?
问题原因
SQL的执行逻辑是先处理WHERE子句过滤数据,再执行SELECT子句生成列别名。所以你在WHERE里引用phone_number这个别名时,数据库还未生成该列,自然会报错。
解决方案
方案1:重复拼接表达式
直接在WHERE子句中使用和SELECT里相同的CONCAT逻辑,让数据库能直接识别:
select concat(area_code, "-", phone_triad, "-", phone_quad) as phone_number, first_name, last_name from info_table where concat(area_code, "-", phone_triad, "-", phone_quad) in (<LIST OF NUMBERS>);
方案2:用子查询/CTE提前生成别名
先计算出拼接后的列,再在外层进行过滤,可读性更好:
子查询写法
select phone_number, first_name, last_name from ( select concat(area_code, "-", phone_triad, "-", phone_quad) as phone_number, first_name, last_name from info_table ) as temp where phone_number in (<LIST OF NUMBERS>);
CTE写法(适用于MySQL 8+、PostgreSQL、SQL Server等支持CTE的数据库)
with temp as ( select concat(area_code, "-", phone_triad, "-", phone_quad) as phone_number, first_name, last_name from info_table ) select phone_number, first_name, last_name from temp where phone_number in (<LIST OF NUMBERS>);
方案3:使用HAVING子句(不推荐非聚合场景)
HAVING子句在SELECT之后执行,因此可以引用列别名,但需要配合GROUP BY使用(不同数据库对GROUP BY的要求有差异):
select concat(area_code, "-", phone_triad, "-", phone_quad) as phone_number, first_name, last_name from info_table group by phone_number, first_name, last_name having phone_number in (<LIST OF NUMBERS>);
内容的提问来源于stack exchange,提问作者Ryan Cohan
相关产品推荐
相关产品推荐

