在 where 条件中添加 case 语句并在 then 子句中提供条件语句

Adding case statement inside where condition and provide conditional statements inside then clause

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

我的 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  

但是此查询在 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
  • 试试这个

    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
    

试试这个:你必须根据你的要求制定两个单独的条件并记住一件事,你只能开始 CASE 作为 WHERE a = CASE 而不是WHERE CASE ...THEN a = b+c ... 或者在这种情况下,我建议使用动态查询,这样可以很容易地根据不同条件操作查询[=​​14=]

WHERE convert(varchar,dt_start,103) =
    CASE WHEN Substring(datename(dw,getdate()),1,3) = 'mon' THEN 
        convert(varchar,dateadd(day,-3,getdate()),103) 
    ELSE 
        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 
        convert(varchar,dt_start,103)
    END