【问题标题】:"CASE" statement within "WHERE" clause in SQL Server 2012SQL Server 2012 中“WHERE”子句中的“CASE”语句
【发布时间】:2014-03-05 04:12:24
【问题描述】:

我有一个这样的选择语句

select x, y , z from table a
where CAST( CAST(DATEColumn AS VARCHAR) AS DATE) between  
    case when a.columnx = '1900-01-01' then CAST( CAST(DATEColumn AS VARCHAR) AS DATE) else c.columnx end
    and cast( c.CustomerShipToRecTrmDt as date)

为什么这个case语句不起作用 而如果我对日期进行硬编码,case 语句是否有效?

【问题讨论】:

  • 请显示两个示例。还有一些原始数据。实际上为什么不创建一个简单的sqlfiddle.com 以便人们可以看到数据和查询
  • 该查询无效。没有 END 和额外的 CAST 是怎么回事?请修复您的帖子以获得更多帮助。而且你应该有一个 ELSE 在案例中。

标签: sql tsql case-when


【解决方案1】:

您要将日期列转换为varchar,然后再转换为date?我认为这可以满足您的要求:

select x, y , z 
rom table a
where DATEColumn  between  
          (case when a.columnx = '1900-01-01' then DATEColumn else cast(c.columnx as date) end and
          cast( c.CustomerShipToRecTrmDt as date)

您可以通过以下方式从where 子句中消除case 语句:

where DATEColumn >= cast(c.columnx as date) and DateColumns <= cast( c.CustomerShipToRecTrmDt as date)

1900-01-01 的比较不会影响&gt;= 部分,除非您使用的是1900 年之前的日期(我猜这不太可能)。

此外,每当将值转换为 varchar() 时,始终包括长度(如在 varchar(255) 中)。

【讨论】:

  • select x, y , z from table a where CAST( CAST(DATEColumn AS VARCHAR) AS DATE) 在 a.columnx = '1900-01-01' 然后 CAST( CAST(DATEColumn AS VARCHAR) AS DATE) else c.columnx end and cast( c.CustomerShipToRecTrmDt as date) 我有 columnx....如果该特定列中的 columnx 是 1900-01-01,那么我说...给它 DateColumn (这是 int,但我将其转换为 Date),否则为 columnx
猜你喜欢
  • 2013-06-30
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多