【问题标题】:TERADATA case when statement in WHERE clauseWHERE 子句中的语句时的 TERADATA 情况
【发布时间】:2017-10-18 19:28:34
【问题描述】:

我需要在 WHERE 子句中写一个 case 语句,即—— 当 current_date 是本月的 1 日时,请选择上个月的第一天和上个月的最后一天之间的数据 ELSE 从当前月份的 1 日至今。到目前为止,我已经写了这个,但它不起作用。 '05/01/2017' 将是输入日期。

SELECT *
FROM    MyTable
WHERE calendar_date
    BETWEEN
        CASE WHEN extract (day from CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY')) =1 --check to see date is 1st of month
        THEN  ADD_MONTHS((CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY') - EXTRACT(DAY FROM CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY'))+1), -1) --1st of prev month
                AND ADD_MONTHS(CURRENT_DATE - EXTRACT(DAY FROM CURRENT_date), 0 ) --last day prev month
        ELSE             CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY') - EXTRACT(DAY FROM CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/YYYY'))+1, 0) --else 1st of Curr mont

        AND CURRENT_DATE
    end
    order by calendar_date

【问题讨论】:

  • 只是一个建议,但您可以在 SELECT 子句中派生所需的字段并将查询包装在一个内联视图(子查询)中。如果您可以从条件逻辑中看到派生值,可能会使代码更易于阅读(和调试)。
  • @Sevyns,你能举个例子说明你的建议吗?
  • 一开始,日期文字写成:date '2017-05-01',如select date '2017-05-01' + 1
  • 在 cmets 中可能不是最容易阅读的,但这里是 SELECT ExampleElement1 ,Element2 FROM ( SELECT CASE WHEN 1 = 1 THEN 1 End as ExampleElement1 ,Element2 From MyTable ) WHERE ExampleElement1 = 1是在对其进行约束之前首先(并且在一个位置)正确地获得条件逻辑。可能需要修改语法 - 目前无法在 TD 中使用。

标签: teradata where-clause case-when


【解决方案1】:
select      *

from        mytable

where       calendar_date   between case 
                                        when td_day_of_month (current_date) = 1
                                        then current_date - interval '1' month
                                        else td_month_begin (current_date)
                                    end

                            and     case 
                                        when td_day_of_month (current_date) = 1
                                        then current_date - 1
                                        else current_date 
                                    end


order by    calendar_date

【讨论】:

    【解决方案2】:

    @Dudu,根据您的建议,我能够解决 sql。在这里:

    SELECT * FROM MYTABLE
                            WHERE CALENDAR_DATE
                                BETWEEN
                                    CASE WHEN extract (day from CAST( '05/15/2017' AS DATE FORMAT 'MM/DD/YYYY')) = 1
                                             THEN  (ADD_MONTHS((CAST( '05/15/2017' AS DATE FORMAT 'MM/DD/YYYY') - EXTRACT(DAY FROM CAST( '05/15/2017' AS DATE FORMAT 'MM/DD/YYYY'))+1), -1) )
                                            ELSE          ADD_MONTHS(CURRENT_DATE - EXTRACT(DAY FROM CURRENT_DATE)+1, 0)
                                    END
                                AND 
                                        CASE WHEN extract (day from CAST( '05/15/2017' AS DATE FORMAT 'MM/DD/YYYY')) > 1
                                            THEN     CURRENT_DATE  
                                            ELSE          ADD_MONTHS(CURRENT_DATE - EXTRACT(DAY FROM CURRENT_date), 0 ) 
                                    END
                                    AND  REPORTNAME_MASTER_ID IN (2565,5216,5364)
                            order by CALENDAR_DATE
    

    【讨论】:

    • CAST( '05/15/2017' AS DATE FORMAT 'MM/DD/YYYY') 可以(并且应该)被date '2017-05-15'替换
    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    相关资源
    最近更新 更多