我试图使用下面的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;发布于 2015-04-04 00:02:58
由于某种原因,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“--日期的名称,填充了空格,以便在用于此元素的date语言中显示最宽的日期名称的宽度。
可不是我期望的。
发布于 2015-04-04 08:34:38
有两件事要注意:
TRIM空白填充。Oracle提供FM,即填充模式格式,以消除空白填充。NLS_DATE_LANGUAGE,因为格式是、NLS依赖的。来自关于格式模型修饰符的Oracle文档:
调频 填充模式。Oracle使用尾随空白字符和前导零将格式元素填充到恒定宽度。宽度等于相关格式模型中最大元素的显示宽度:
FM修饰符在TO_CHAR函数的返回值中抑制上述填充。
因此,您可以使用FMDAY而不是DAY格式来消除空白填充。
例如,
SQL> SELECT '#' || to_char(SYSDATE, 'fmDAY') || '#' as dt FROM dual;
DT
-----------
#SATURDAY#
SQL>因此,您可以将case语句修改为:
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>https://stackoverflow.com/questions/29440920
复制相似问题