PostgreSQL中带别名与不带别名的WHERE子句查询结果不一致问题咨询
问题原因与解决办法
你的两个查询结果不一致的核心原因是WHERE子句里的email引用对象完全不同:
- 第一个查询的
WHERE email like lower('%s%')中,email是customer表的原生字段,不是SELECT子句定义的别名。PostgreSQL执行SQL的顺序是先处理WHERE子句过滤数据,再执行SELECT生成列和别名,所以WHERE里根本识别不了SELECT里的别名——这里实际是在过滤原表自带的email字段包含目标字符的行。 - 第二个查询则是直接对计算生成的email(首字母+姓氏+域名转小写)做过滤,筛选这个计算值里包含目标字符的行。
两个查询的过滤逻辑完全不一样,不管替换成什么字符,结果自然都会有差异。
如果想基于你生成的那个计算email做过滤,有两种更清晰的写法:
方法1:使用CTE(公共表表达式)
WITH customer_emails AS ( SELECT lower(left(first_name,1) || '.' || last_name || '@xmail.com') as email FROM customer ) SELECT email FROM customer_emails WHERE email LIKE lower('%s%');
方法2:使用子查询
SELECT email FROM ( SELECT lower(left(first_name,1) || '.' || last_name || '@xmail.com') as email FROM customer ) AS sub WHERE email LIKE lower('%s%');
这样就能保证过滤和返回的是同一个计算后的email值,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Vsn
相关产品推荐
相关产品推荐

