[英]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” - 日期名稱,填充空白以顯示此元素使用的日期語言中最寬的日期名稱的寬度。
不是我的預期。
有兩點需要注意:
無需手動TRIM
空白填充。 Oracle提供FM
即填充模式格式以消除空白填充。
您應該明確提及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.