首页 > 解决方案 > 在 where 条件中添加 case 语句并在 then 子句中提供条件语句

问题描述

我有一个where子句,我需要在其中添加case语句,then并且else 我必须给出条件语句。

我的 where 条件看起来像这样

WHERE 
    CASE
        WHEN 
        Substring(datename(dw,getdate()),1,3) = 'mon' 
        THEN convert(varchar,dt_start,103) = convert(varchar,dateadd(day,-3,getdate()),103) 
        AND  convert(varchar,dt_start,103) <= convert(varchar,dateadd(day,-2,getdate()),103)
        ELSE convert(varchar,dt_start,103) = convert(varchar,dateadd(day,-1,getdate()),103)
    END  

但是这个查询在=inside显示语法错误then。相同的逻辑在 PostgreSQL 中有效,但是当我在 SQL 服务器中尝试时,它在 = 处出现语法错误。我怎么能解决这个问题。请帮忙
这是对应的PGSQL查询。

WHERE 
    CASE
        WHEN to_char(now(), 'dy'::text) = 'mon'::text THEN to_char(dt_start, 'yyyymmdd'::text) = to_char(now() - '3 days'::interval, 'yyyymmdd'::text) AND to_char(dt_start, 'yyyymmdd'::text) <= to_char(now() - '2 days'::interval, 'yyyymmdd'::text)
        ELSE to_char(dt_start, 'yyyymmdd'::text) = to_char(now() - '1 day'::interval, 'yyyymmdd'::text)
    END

标签: sqlsql-servercasewhere-clause

解决方案


  • 试试这个

    WHERE 
    convert(varchar,dt_start,103)=
    CASE
        WHEN 
        Substring(datename(dw,getdate()),1,3) = 'mon' 
        THEN convert(varchar,dt_start,103) = 
        convert(varchar,dateadd(day,-3,getdate()),103) 
        ELSE convert(varchar,dt_start,103) = 
        convert(varchar,dateadd(day,-1,getdate()),103)
    END  
    
    AND
    
    convert(varchar,dt_start,103)<=
    CASE
     WHEN 
     Substring(datename(dw,getdate()),1,3) = 'mon' 
      then convert(varchar,dateadd(day,-2,getdate()),103)
      else
      --put a condition that does not filter any data (maybe)
      convert(varchar,getdate(),103)
      end
    

推荐阅读