【问题标题】:SQL replace using SELECT and invalid column使用 SELECT 和无效列的 SQL 替换
【发布时间】:2015-03-03 12:05:50
【问题描述】:

我有一个简单的表格,其中日期列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 语句工作正常。

【问题讨论】:

  • SQL 只是 结构化查询语言 - 许多数据库系统使用的语言,但不是数据库产品...很多事情都是特定于供应商的 - 所以我们真的需要知道您正在使用什么数据库系统(以及哪个版本)(请相应地更新标签)......
  • 很遗憾,您不能在 where 子句中使用 select 别名;他们不被认可。您可以复制 where 子句中的值,但希望有人有更优雅的解决方案。
  • 在 SQL Server 中,切勿在没有长度说明符的情况下使用 varchar

标签: sql sql-server replace case datediff


【解决方案1】:

您不能在WHERE 子句中使用与定义为相同级别的别名,因为WHERE 子句在SELECT 子句之前评估。请尝试以下操作:

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

而不是&lt;...&gt; 将您的查询不带WHERE 子句。

【讨论】:

    【解决方案2】:

    您不能引用您刚刚在 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 
    

    【讨论】:

    • 杰夫,太棒了,我尝试了第一个版本,效果很好,尽管我还有另一个问题。我的列是一个 varchar(max),它将日期存储为“mm/yyyy”我现在在 DATEDIFF 上遇到错误,即在转换期间。这是我所拥有的: DATEDIFF(year, GETDATE(), CONVERT(datetime, x)) > 5 以上在转换中产生错误。有任何想法吗?再次感谢上述内容。
    • 没关系,刚刚知道怎么做。这是对可能需要它的人的参考。下面的语句将 mm/yyyy 转换为有效的日期时间:code CAST((SUBSTRING(answer_6,1,2) + '/01' + SUBSTRING(answer_6,3,5)) as datetime)
    【解决方案3】:

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

    但是,answer_6 列的可能值之一是 varchar 格式(“现在”)。 您需要具有有效的数据格式才能正确使用 DATEDIFF 功能。 (例如:'yyyy-mm-dd')。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多