PostgreSQL中如何将提取的日期应用到查询的WHERE子句中
报错原因
SQL的执行逻辑中,WHERE 子句的执行优先级高于 SELECT 子句,你在 SELECT 中定义的别名 new_year 在执行 WHERE 过滤时还未生成,因此系统会提示该字段不存在。此外你原有语句中的 t.amount NOTNULL 写法也不符合标准SQL规范,需要同步调整。
同时注意你原SQL中三个表关联缺少了customers和credit_cards的关联条件,会出现笛卡尔积导致结果错误,需要根据你实际的表外键字段补充对应关联逻辑。
推荐修正方案
直接在 WHERE 子句中完成日期提取逻辑,不需要依赖别名,同时改用更易读的显式JOIN写法替代老旧的隐式连接:
SELECT cs.name, DATE(t.datetime) AS new_year FROM customers cs -- 下方关联条件的外键字段请替换为你表中的实际字段名 INNER JOIN credit_cards cc ON cc.customer_id = cs.id INNER JOIN transactions t ON t.number = cc.number WHERE cc.type = 'visa' AND t.amount IS NOT NULL AND DATE(t.datetime) = '2019-01-01';
如果你的datetime字段建有索引,想要获得更好的查询性能,可以改用范围过滤避免对字段做函数计算,能够触发索引优化:
AND t.datetime >= '2019-01-01 00:00:00' AND t.datetime < '2019-01-02 00:00:00'
可选方案(需要保留别名的场景)
如果你确实需要复用别名,可以通过子查询或者CTE先计算出别名对应的字段,再在外层做过滤:
WITH transaction_data AS ( SELECT cs.name, DATE(t.datetime) AS new_year FROM customers cs INNER JOIN credit_cards cc ON cc.customer_id = cs.id INNER JOIN transactions t ON t.number = cc.number WHERE cc.type = 'visa' AND t.amount IS NOT NULL ) SELECT * FROM transaction_data WHERE new_year = '2019-01-01';
内容的提问来源于stack exchange,提问作者priceless32
相关产品推荐
相关产品推荐

