SQL替换使用SELECT和无效列

时间:2015-01-05 21:30:32

标签: sql sql-server replace case datediff

我有一个简单的表格,其中日期列answer_6(格式为varchar(max)要么具有有效日期或字符串Now。我想用Now代替select CASE [answer_6] WHEN 'Now' THEN CONVERT(varchar, GETDATE()) ELSE answer_6 END as x, answer_6 from [tDataMult] where DATEDIFF(yy, GETDATE(), [x]) > 5 当前的日期/时间,然后计算差异。这是我做的:

invalid column name 'x'

系统会给我DateDiff。如果我删除SELECT {{1}}语句就可以了。

3 个答案:

答案 0 :(得分:1)

您不能在同一级别的WHERE子句中使用别名,因为WHERE子句在 SELECT子句之前被评估为。请尝试以下方法:

SELECT t.* FROM (<...>) t WHERE DATEDIFF(yy, GETDATE(), [t.x]) > 5 

相反<...>将您的查询设为WHERE子句。

答案 1 :(得分:1)

您无法引用您在WHERE子句中创建的别名。修复它的最简单方法就是将原始查询转换为子查询:

SELECT * 
FROM 
(
  select 
  CASE [answer_6]
     WHEN 'Now' THEN CONVERT(varchar, GETDATE())
     ELSE answer_6 
  END as x, 
   answer_6 from [tDataMult]
) AS qry
WHERE DATEDIFF(yy, GETDATE(), [x]) > 5

或者您可以复制WHERE子句中的表达式:

select 
CASE [answer_6]
   WHEN 'Now' THEN CONVERT(varchar, GETDATE())
   ELSE answer_6 
END as x, 
 answer_6 from [tDataMult] 
WHERE DATEDIFF(yy, GETDATE(), 
  (CASE [answer_6]
     WHEN 'Now' THEN CONVERT(varchar, GETDATE())
     ELSE answer_6
     END)
  ) > 5 

答案 2 :(得分:0)

TDataMult表中不存在列X,因为它是别名。 在DateDiff函数中将其替换为answer_6。

然而,answer_6列的一个可能值是varchar格式(&#39;现在&#39;)。 您需要具有有效的数据格式才能正确使用DATEDIFF功能。 (例如:&#39; yyyy-mm-dd&#39;)。