我试图使用以下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;
答案 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)
有两点需要注意:
手动无需TRIM
空白填充。 Oracle提供FM
即填充模式格式以消除空白填充。
您应明确提及NLS_DATE_LANGUAGE
,因为格式为取决于NLS 。
来自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>