SQL按条件重新赋值报错‘无效列名’,求视图查询解决方案
解决SQL中"invalid column name"错误的方案
嘿,我一眼就看出问题出在哪啦!你在SELECT里给DATEDIFF(day, DateColumn, getdate())起了别名antiquity,然后想在同一个SELECT的CASE语句里直接用这个别名——但SQL的执行顺序不允许这么做哦!
SQL解析的时候,会先处理FROM、WHERE这些子句,然后才会处理SELECT里的列别名。也就是说,当CASE语句试图找antiquity的时候,这个别名还没被创建出来,自然就报“无效列名”的错误了。
给你两个简单的解决办法:
方案一:重复计算表达式(适合简单场景)
直接把DATEDIFF的表达式写到CASE条件里就行,虽然看起来有点重复,但SQL引擎一般会自动优化,不会真的重复计算两次:
SELECT top 100 DATEDIFF(day, DateColumn, getdate()) as antiquity, CASE WHEN DATEDIFF(day, DateColumn, getdate()) <= 1000 THEN 'do something' WHEN DATEDIFF(day, DateColumn, getdate()) > 1000 THEN 'do something else' END FROM myTable;
方案二:用子查询/CTE先计算别名(适合复杂场景)
如果你的表达式更复杂,不想重复写,那就先用子查询或者CTE把antiquity计算出来,再在外层查询里用CASE引用它:
用CTE的版本:
WITH CTE_WithAntiquity AS ( SELECT top 100 DATEDIFF(day, DateColumn, getdate()) as antiquity FROM myTable ) SELECT antiquity, CASE WHEN antiquity <= 1000 THEN 'do something' WHEN antiquity > 1000 THEN 'do something else' END FROM CTE_WithAntiquity;
用子查询的版本:
SELECT antiquity, CASE WHEN antiquity <= 1000 THEN 'do something' WHEN antiquity > 1000 THEN 'do something else' END FROM ( SELECT top 100 DATEDIFF(day, DateColumn, getdate()) as antiquity FROM myTable ) AS SubQuery;
这样写不仅能解决错误,代码可读性也更高,以后维护起来更方便~
内容的提问来源于stack exchange,提问作者Luis Jasso
相关产品推荐
相关产品推荐

