簡體   English   中英

Oracle Case語句不起作用

[英]Oracle Case statement not working

我正在嘗試使用以下case語句從我的表中提取信息,如果我忽略case語句並手動輸入它的工作日,但case語句不是它似乎只是直接跳轉到else部分,任何建議好嗎?

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;

由於某種原因,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;

如果您查看文檔,它會指出“DAY” - 日期名稱,填充空白以顯示此元素使用的日期語言中最寬的日期名稱的寬度。

不是我的預期。

有兩點需要注意:

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

  2. 您應該明確提及NLS_DATE_LANGUAGE因為格式取決於NLS

從關於格式模型修飾符的 Oracle文檔:

調頻

填充模式。 Oracle使用尾隨空白字符和前導零來將格式元素填充到恆定寬度。 寬度等於相關格式模型的最大元素的顯示寬度:

  • 數字元素用前導零填充到元素允許的最大值的寬度。 例如,YYYY元素填充為四位數(長度為“9999”),HH24填充為兩位數(長度為“23”),DDD填充為三位數(長度為“366”)。

  • 字符元素MONTH,MON,DAY和DY用尾隨空格填充到有效名稱中最長的完整月份名稱,最長的縮寫月份名稱,最長的完整日期名稱或最長的縮寫日期名稱的寬度由NLS_DATE_LANGUAGE和NLS_CALENDAR參數的值確定。 例如,當NLS_DATE_LANGUAGE為AMERICAN且NLS_CALENDAR為GREGORIAN(默認值)時,MONTH的最大元素為SEPTEMBER,因此MONTH格式元素的所有值都填充為九個顯示字符。 NLS_DATE_LANGUAGE和NLS_CALENDAR參數的值在TO_CHAR和TO_ * datetime函數的第三個參數中指定,或者從當前會話的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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM