首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle Case语句不工作

问Oracle Case语句不工作
EN

Stack Overflow用户
提问于 2015-04-03 23:12:59
回答 2查看 525关注 0票数 3

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

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-04 00:02:58

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

代码语言:javascript
复制
select '#' || to_char(SYSDATE+2, 'DAY') || '#' from dual 

然后它回来了:#SUNDAY #

将查询更改为:

代码语言:javascript
复制
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语言中显示最宽的日期名称的宽度。

可不是我期望的。

票数 3
EN

Stack Overflow用户

发布于 2015-04-04 08:34:38

有两件事要注意:

  1. 不需要手动TRIM空白填充。Oracle提供FM,即填充模式格式,以消除空白填充。
  2. 您应该显式地提到NLS_DATE_LANGUAGE,因为格式是、NLS依赖的。

来自关于格式模型修饰符的Oracle文档:

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

  • 数值元素以前导零填充到元素允许的最大值的宽度。例如,将YYYY元素填充为四个数字(长度为'9999'),将HH24填充为两位数字(长度为'23'),将DDD填充为三个数字(长度为'366')。
  • 在由NLS_DATE_LANGUAGE和NLS_CALENDAR参数的值确定的有效名称中,字符元素月份、MON、DAY和DY分别填充尾随空格到最长的完整月份名称、最长的缩写月份名称、最长的全日名称或最长的缩短日期名称的宽度。例如,当NLS_DATE_LANGUAGE是美国人,而NLS_CALENDAR是GREGORIAN (默认值)时,月份的最大元素是9月份,因此月份格式元素的所有值都填充到9个显示字符中。NLS_DATE_LANGUAGE和NLS_CALENDAR参数的值在TO_CHAR和TO_*日期时间函数的第三个参数中指定,或者从当前会话的NLS环境中检索它们。
  • 字符元素RM与尾随空格填充为4,即'viii‘的长度。
  • 其他字符元素和拼出的数字(SP、SPTH和THSP后缀)没有填充.

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

因此,您可以使用FMDAY而不是DAY格式来消除空白填充。

例如,

代码语言:javascript
复制
SQL> SELECT '#' || to_char(SYSDATE, 'fmDAY') || '#' as dt FROM dual;

DT
-----------
#SATURDAY#

SQL>

因此,您可以将case语句修改为:

代码语言:javascript
复制
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

例如,

代码语言:javascript
复制
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>

因此,您需要在单独的语句级别上提到它:

代码语言:javascript
复制
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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29440920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档