SQL查询用IS NOT NULL过滤别名inslider报错:未知列如何解决?
解决WHERE子句中无法使用字段别名过滤NULL的问题
这个问题我碰到过好多次啦,其实根源是SQL的执行顺序在捣乱!先给你捋明白为啥会报错:
SQL语句的执行流程是:FROM → JOIN → WHERE → GROUP BY → SELECT → ORDER BY。你在SELECT里定义的别名inslider,要到SELECT阶段才会被创建,但WHERE是在GROUP BY之前就执行了,这时候数据库根本不知道inslider这个字段存在,自然会抛出“Unknown column”的错误。
那怎么过滤掉inslider为NULL的结果呢?给你两种实用的解决方案:
方案1:用HAVING子句替代WHERE
HAVING子句是在GROUP BY和SELECT之后执行的,这时候inslider这个别名已经生效了,直接把过滤条件放到HAVING里就行,代码最简洁:
SELECT cnt.id, cnt.title, cnt.introtext, cnt.fulltext, cnt.ordering, cnt.images, cnt.alias, cnt.state, f.item_id, MAX(CASE WHEN f.field_id = 3 THEN f.value END) AS inslider FROM snm_fields_values f JOIN snm_content cnt ON cnt.id = f.item_id WHERE cnt.state = 1 AND f.value = 'ja' GROUP BY f.item_id HAVING inslider IS NOT NULL -- 把原WHERE里的过滤条件移到这里 ORDER BY f.item_id, inslider
方案2:用子查询/CTE先生成结果再过滤
如果更习惯用WHERE的逻辑,也可以先把包含inslider的查询结果作为临时数据集,再在外层用WHERE过滤:
子查询写法:
SELECT * FROM ( SELECT cnt.id, cnt.title, cnt.introtext, cnt.fulltext, cnt.ordering, cnt.images, cnt.alias, cnt.state, f.item_id, MAX(CASE WHEN f.field_id = 3 THEN f.value END) AS inslider FROM snm_fields_values f JOIN snm_content cnt ON cnt.id = f.item_id WHERE cnt.state = 1 AND f.value = 'ja' GROUP BY f.item_id ) AS temp_result WHERE inslider IS NOT NULL ORDER BY item_id, inslider
CTE写法(更易读,适合复杂查询场景):
WITH temp_result AS ( SELECT cnt.id, cnt.title, cnt.introtext, cnt.fulltext, cnt.ordering, cnt.images, cnt.alias, cnt.state, f.item_id, MAX(CASE WHEN f.field_id = 3 THEN f.value END) AS inslider FROM snm_fields_values f JOIN snm_content cnt ON cnt.id = f.item_id WHERE cnt.state = 1 AND f.value = 'ja' GROUP BY f.item_id ) SELECT * FROM temp_result WHERE inslider IS NOT NULL ORDER BY item_id, inslider
两种方案都能解决你的问题,个人更推荐方案1,代码简洁还不影响性能~
内容的提问来源于stack exchange,提问作者twan
相关产品推荐
相关产品推荐

