【问题标题】:Adding case statement inside where condition and provide conditional statements inside then clause在 where 条件中添加 case 语句并在 then 子句中提供条件语句
【发布时间】:2018-06-20 04:07:11
【问题描述】:

我有一个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

【问题讨论】:

  • 我看不出这在 PostgreSQL 或任何其他 RDBMS 中是如何工作的。 SQL 中的CASE 是一个返回单个标量值的表达式。它不能像过程语言那样用于控制执行流程。
  • 是的,它在 pgsql 中工作。我已经添加了有问题的 pgsql where 子句。

标签: sql sql-server case where-clause


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    • 试试这个

      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
      

    【讨论】:

    • 感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多