Oracle Case语句不起作用

时间:2015-04-03 23:12:59

标签: sql oracle

我试图使用以下case语句从我的表中提取信息,如果我忽略case语句并手动输入它的工作日,但case语句似乎没有跳转直接到其他部分,有什么建议吗?

SELECT * FROM mytable WHERE day = CASE WHEN to_char(SYSDATE, 'DAY') = 'SATURDAY' THEN 'Sat'
                                       WHEN to_char(SYSDATE, 'DAY') = 'SUNDAY' THEN 'Sun'
                                       ELSE 'weekday' END;

2 个答案:

答案 0 :(得分:3)

由于某种原因,to_char函数使用末尾的空格填充字符串,但它不匹配。我试过这个:

select '#' || to_char(SYSDATE+2, 'DAY') || '#' from dual 

并返回:#SUNDAY #

将您的查询更改为:

SELECT * FROM mytable WHERE day = CASE WHEN trim(to_char(SYSDATE, 'DAY')) = 'SATURDAY' THEN 'Sat'
                                       WHEN trim(to_char(SYSDATE, 'DAY')) = 'SUNDAY' THEN 'Sun'
                                       ELSE 'weekday' END;

如果你看一下documentation它就说明了#34; DAY" - 日期名称,用空格填充,以此元素使用的日期语言显示最宽日期的宽度。

不是我的预期。

答案 1 :(得分:0)

有两点需要注意:

  1. 手动无需TRIM空白填充。 Oracle提供FM即填充模式格式以消除空白填充。

  2. 您应明确提及NLS_DATE_LANGUAGE,因为格式为取决于NLS

  3. 来自Format Model Modifiers上的Oracle文档:

      

    FM

         

    填充模式。 Oracle使用尾随空白字符和前导零   将格式元素填充到恒定宽度。宽度等于   显示相关格式模型的最大元素的宽度:

         
        
    • 数字元素用前导零填充到元素允许的最大值的宽度。例如,YYYY元素   填充为四位数(长度为' 9999'),HH24为两位数   (长度为' 23'),DDD为三位数(长度为' 366')。

    •   
    • 字符元素MONTH,MON,DAY和DY用尾随空白填充到最长的完整月份名称的宽度,   最长的缩写月份名称,最长的完整日期名称,或者   最长的缩写日名称,分别在有效名称中   由NLS_DATE_LANGUAGE和NLS_CALENDAR的值确定   参数。例如,当NLS_DATE_LANGUAGE是AMERICAN时   NLS_CALENDAR是GREGORIAN(默认值),是MONTH的最大元素   是9月,所以MONTH格式元素的所有值都填充到   九个显示字符。 NLS_DATE_LANGUAGE和的值   NLS_CALENDAR参数在TO_CHAR的第三个参数中指定   和TO_ *日期时间函数或从NLS检索它们   本届会议的环境。

    •   
    • 字符元素RM用尾随空白填充长度为4,这是' viii'的长度。

    •   
    • 其他字符元素和拼写的数字(SP,SPTH和THSP后缀)未填充。

    •   
         

    FM修饰符在返回值中抑制上述填充   TO_CHAR函数。

    因此,您可以使用FMDAY代替DAY格式来摆脱空白填充

    例如,

    SQL> SELECT '#' || to_char(SYSDATE, 'fmDAY') || '#' as dt FROM dual;
    
    DT
    -----------
    #SATURDAY#
    
    SQL>
    

    因此,您可以将案例陈述修改为:

    SQL> SELECT
      2    CASE
      3      WHEN TO_CHAR(SYSDATE, 'FMDAY') = 'SATURDAY'
      4      THEN 'Sat'
      5      WHEN TO_CHAR(SYSDATE, 'FMDAY') = 'SUNDAY'
      6      THEN 'Sun'
      7      ELSE 'weekday'
      8    END as day
      9  FROM dual;
    
    DAY
    -------
    Sat
    
    SQL>
    

    使用 NLS_DATE_LANGUAGE

    例如,

    SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='french';
    
    Session altered.
    
    SQL>
    SQL> SELECT '#' || to_char(SYSDATE, 'fmDAY') || '#' as dt FROM dual;
    
    DT
    ----------
    #SAMEDI#
    
    SQL>
    SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='english';
    
    Session altered.
    
    SQL>
    SQL> SELECT '#' || to_char(SYSDATE, 'fmDAY') || '#' as dt FROM dual;
    
    DT
    -----------
    #SATURDAY#
    
    SQL>
    

    因此,您需要在个别声明级别提及它:

    SQL> SELECT
      2    CASE
      3      WHEN TO_CHAR(SYSDATE, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'SATURDAY'
      4      THEN 'Sat'
      5      WHEN TO_CHAR(SYSDATE, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'SUNDAY'
      6      THEN 'Sun'
      7      ELSE 'weekday'
      8    END AS DAY
      9  FROM dual;
    
    DAY
    -------
    Sat
    
    SQL>