【问题标题】:Teradata : using case statement in Where clauseTeradata:在 Where 子句中使用 case 语句
【发布时间】:2018-07-04 02:42:27
【问题描述】:

我的问题是关于在 where 子句中使用 case 语句来检查日期并将值分配给列。我的示例代码包括。

select * from table
where 
column 1 > 10 and 
case when column 2 = 1 
  then 
    column 3<= 10 and column 4 between (1st day of prev month) and (prev month end) or column 5 = '8888-01-01' 
  else 
    column 4 between (1st day of this month) and (yesterday)
end ; 

当我运行此代码时。我收到 3706 语法错误:预计在字段和“=”之间存在某些内容。

如何解决这个问题?

【问题讨论】:

    标签: case teradata where-clause


    【解决方案1】:

    CASE 语句将始终返回一个值或 NULL(如果没有任何条件匹配),因此您可以在 WHERE 子句中使用它。有几种方法可以格式化 CASE 语句:

    格式 1

    CASE 
    WHEN <condition> THEN <some_expression> 
    WHEN <another_condition> THEN <another_expression>
    ELSE <final_expression> 
    END
    
    -- Example
    CASE 
    WHEN col1 = 10 THEN 'Y'
    WHEN col1 = 20 THEN 'N'
    ELSE 'N/A'
    END
    

    格式2

    CASE <expression>
    WHEN <value> THEN <expression>
    WHEN <another_value> THEN <another_expression>
    ELSE <final_expression>
    END
    
    -- Example
    CASE col1
    WHEN 10 THEN 'Y'
    WHEN 20 THEN 'N'
    ELSE 'NA'
    END
    

    我不确定您要对示例代码做什么,但它看起来更像是伪代码,无法按原样工作。您的 CASE 语句格式不正确,您的列引用(如 column 1)将无法正常工作。如果您的列实际上命名为column 1,那么您需要在其周围加上双引号:

    select * from table where "column 1" &gt; 10

    您能否更清楚地描述一下您到底想做什么?

    【讨论】:

    • 我需要根据当前日期运行我的 SQL 代码。如果我当前的日期是该月的第一天,它应该返回上个月的数据,否则它应该返回当前月份直到昨天。基于这种情况,我需要为我的列分配上限和下限日期。我在 where 子句中使用 case 语句进行了尝试。我收到 3706 语法错误。我不确定这是否会发生,因为我在我的案例中使用了“介于”。
    【解决方案2】:

    CASE 表达式不能用于创建某种动态条件。把它写成一堆 AND/OR 条件:

    select * from table
    where 
    column 1 > 10 and 
     (
       ( column 2 = 1 and
         (column 3<= 10 and column 4 between (1st day of prev month) and (prev month end) or column 5 = '8888-01-01')
       )
      or  
        column 4 between (1st day of this month) and (yesterday)
     );
    

    仔细检查逻辑,逻辑运算符的优先级是

    1. 括号
    2. 不是

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多