WHERE子句中的TERADATA case when语句

WHERE子句中的TERADATA case when语句,teradata,where-clause,case-when,Teradata,Where Clause,Case When,我需要在WHERE子句中写一个case语句,它是- 当当前_日期为月1日时,选择上个月1日和上个月最后一日之间的数据 从当前月1日至日期的其他日期。到目前为止,我已经写了这篇文章,但它不起作用“2017年1月5日”将作为输入日期 SELECT * FROM MyTable WHERE calendar_date BETWEEN CASE WHEN extract (day from CAST( '05/01/2017' AS DATE FORMAT 'MM/DD/Y

我需要在WHERE子句中写一个case语句,它是- 当当前_日期为月1日时,选择上个月1日和上个月最后一日之间的数据 从当前月1日至日期的其他日期。到目前为止,我已经写了这篇文章,但它不起作用“2017年1月5日”将作为输入日期

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

@嘟嘟,根据你的建议,我能够解决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

这只是一个建议,但您可以在SELECT子句中派生所需的字段,并将查询包装在一个内嵌视图子查询中。如果您能看到条件逻辑中的派生值,可能会使代码更易于阅读和调试。@Sevyns,您能提供一个示例说明您的建议吗?对于开始,日期文字写为:日期“2017-05-01”,如选择日期“2017-05-01”+1在注释中可能不是最容易阅读的,但是这里是选择ExampleElement1,当1=1时,从SELECT CASE中选择Element2,然后1作为ExampleElement1结束,从MyTable中选择Element2,其中ExampleElement1=1一般的想法是在约束条件逻辑之前,先在1个位置获得条件逻辑的正确性。可能需要调整语法-目前不适用于TD。将“2017年5月15日”转换为日期格式“MM/DD/YYYY”可以且应该替换为日期“2017-05-15”
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