在Oracle APEX的case语句中使用to_char函数

时间:2015-10-16 21:27:13

标签: sql oracle oracle-apex case-statement to-char

我正在研究Oracle APEX编写一个查询,该查询列出了2016年学生即将到来的生日,并按时间顺序排序。这很有效,我使用了以下代码:

SELECT first_name, last_name, to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy') AS birthday
FROM students
WHERE date_of_birth IS NOT NULL
ORDER BY birthday

这给出了正确的输出,并开始显示2016年按时间顺序排列的生日名称。

然而,我现在想要另一个栏目,显示学生在哪一天在课堂上庆祝他们的生日。因此,对于在同一天工作一周的生日的学生,但是对于在周末的周末生日的学生,使用案例陈述来改变星期六'或者'星期日'星期一'。

我已经做了一个查询,显示在哪一天庆祝学生的生日,这提供了正确的输出,例如'星期五'或者'周三',代码是:

SELECT first_name, last_name, to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy') AS birthday, to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day') AS celebrationday
FROM students
WHERE date_of_birth IS NOT NULL
ORDER BY birthday

我已经用case语句完成了一些简单的测试,比如当名字是' John'时添加一些东西,就像这样:

SELECT student_number, first_name,
(CASE first_name
WHEN 'John' THEN 'Check'
END) addition
FROM Students

这导致了正确的输出;除了约翰&#39;以外的所有其他名字添加列将为null,名称为<39> Check&#39;在添加列中。

现在,主要问题的开始比我尝试复制此问题以检查 celebday 是否在周末时我得到以下错误: &#39; ORA-00904&#39;庆祝日&#39;:无效的标识符&#39; ,对于这段代码:

SELECT first_name, last_name, to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy') AS birthday, to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day') AS celebrationday,
(CASE celebrationday
WHEN 'saturday' THEN 'monday'
WHEN 'sunday' THEN 'monday'
END) addition
FROM students
WHERE date_of_birth IS NOT NULL
ORDER BY birthday

(小评论,我知道这个案子也应该包含一周中的其他日子,但起初我有兴趣从周末获得适当的输出)

或者对于以下代码,我只是在添加列中没有得到任何结果,只是空值。

SELECT first_name, last_name, to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy') AS birthday,
CASE to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day)
WHEN 'saturday' THEN 'monday'
WHEN 'sunday' THEN 'monday'
END) addition
FROM Students
WHERE date_of_birth IS NOT NULL
ORDER BY date_of_birth
  • 我需要做些什么才能让案例陈述发挥作用 我可以改变庆祝日吗?我希望所提供的代码示例足够清晰,可以让您了解什么是无效的。

3 个答案:

答案 0 :(得分:0)

啊......你正在使用to_char来回归这一天。您需要考虑查询中的尾随空格。该值基本上键入为char(9)。

我认为如果你修剪结果并添加一个ELSE条件来考虑其他日子你应该好好去..

    CASE trim(to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day'))
    WHEN 'saturday' THEN 'monday'
    WHEN 'sunday' THEN 'monday'
    else trim(to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day'))
    END addition

答案 1 :(得分:0)

为了在case语句中引用庆祝日,你需要将它包装在内部查询中。 select case celebrationday = . . . from ( select . . . as celebrationday . . . )。用于定义它的内部查询和用于响应它的外部查询。

答案 2 :(得分:0)

您可以完全避免使用日期名称:

SELECT 1 + TRUNC (birthday_dt) - TRUNC (birthday_dt, 'IW') day_of_week
, birthday_dt 
  + CASE 1 + TRUNC (birthday_dt) - TRUNC (birthday_dt, 'IW')
      WHEN 6 THEN 2 
      WHEN 7 THEN 1
      ELSE 0 
    END corrected_dt
, to_char(
  birthday_dt 
  + CASE 1 + TRUNC (birthday_dt) - TRUNC (birthday_dt, 'IW')
      WHEN 6 THEN 2 
      WHEN 7 THEN 1
      ELSE 0 
    END
  , 'fmDay') corrected_day
from 
(
select to_date('19/10/2015','DD/MM/YYYY') birthday_dt from dual --monday
union all
select to_date('20/10/2015','DD/MM/YYYY') birthday_dt from dual
union all
select to_date('21/10/2015','DD/MM/YYYY') birthday_dt from dual
union all
select to_date('22/10/2015','DD/MM/YYYY') birthday_dt from dual
union all
select to_date('23/10/2015','DD/MM/YYYY') birthday_dt from dual
union all
select to_date('24/10/2015','DD/MM/YYYY') birthday_dt from dual
union all
select to_date('25/10/2015','DD/MM/YYYY') birthday_dt from dual --sunday
);

Run it on on Oracle's LiveSQL tool

DAY_OF_WEEK CORRECTED_DT CORRECTED_DAY
1           19-OCT-15    Monday
2           20-OCT-15    Tuesday
3           21-OCT-15    Wednesday
4           22-OCT-15    Thursday
5           23-OCT-15    Friday
6           26-OCT-15    Monday
7           26-OCT-15    Monday

星期几(1 + TRUNC (dt) - TRUNC (dt, 'IW'))取自:https://community.oracle.com/thread/2207756