在 Oracle APEX 的 case 语句中使用 to_char 函数
Using a to_char function inside a case statement with Oracle APEX
我在 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 年生日顺序排列的名字。
但是,我现在想要另一个列,显示学生在 class 的哪一天庆祝生日。因此,对于在工作日生日的学生来说,这将是同一天,但对于在周末生日的学生来说,这将是星期一,使用 case 语句将 'saturday' 或 'sunday' 更改为 'monday'.
我已经做了一个查询,显示学生的生日在哪一天庆祝,它给出了正确的输出,如 'friday' 或 'wednesday',代码是:
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
这导致了正确的输出;对于 'John' 以外的所有名称,addition 列将为空,具有该名称的名称将在 addition[=41] 列中具有 'Check' =].
现在,主要问题开始于当我尝试复制它以检查 celebrationday 是否在周末时,我得到以下错误:
'ORA-00904 'celebrationday': 无效标识符',对于这段代码:
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
(小评论,我知道这个案例还应该包含一周中的其他几天,但起初我有兴趣从周末获得适当的输出)
或者对于下面的代码,我在 addition 列中没有得到任何结果,只有空值。
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
- 我需要做什么才能使 case 语句正常工作
我可以改变庆祝日吗?我希望所提供的代码示例足够清晰,可以让您了解哪些有效,哪些无效。
啊...你正在使用 to_char 到 return 的日子。您需要考虑查询中的尾随空格。该值基本上被键入为 char(9).
我想如果你 trim 结果并添加一个 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
为了在 case 语句中引用 celebrationday,您需要将其包装在内部查询中。 select case celebrationday = . . . from ( select . . . as celebrationday . . . )
。定义它的内部查询和响应它的外部查询。
您可以完全避免使用日期名称:
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
我在 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 年生日顺序排列的名字。
但是,我现在想要另一个列,显示学生在 class 的哪一天庆祝生日。因此,对于在工作日生日的学生来说,这将是同一天,但对于在周末生日的学生来说,这将是星期一,使用 case 语句将 'saturday' 或 'sunday' 更改为 'monday'.
我已经做了一个查询,显示学生的生日在哪一天庆祝,它给出了正确的输出,如 'friday' 或 'wednesday',代码是:
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
这导致了正确的输出;对于 'John' 以外的所有名称,addition 列将为空,具有该名称的名称将在 addition[=41] 列中具有 'Check' =].
现在,主要问题开始于当我尝试复制它以检查 celebrationday 是否在周末时,我得到以下错误: 'ORA-00904 'celebrationday': 无效标识符',对于这段代码:
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
(小评论,我知道这个案例还应该包含一周中的其他几天,但起初我有兴趣从周末获得适当的输出)
或者对于下面的代码,我在 addition 列中没有得到任何结果,只有空值。
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
- 我需要做什么才能使 case 语句正常工作 我可以改变庆祝日吗?我希望所提供的代码示例足够清晰,可以让您了解哪些有效,哪些无效。
啊...你正在使用 to_char 到 return 的日子。您需要考虑查询中的尾随空格。该值基本上被键入为 char(9).
我想如果你 trim 结果并添加一个 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
为了在 case 语句中引用 celebrationday,您需要将其包装在内部查询中。 select case celebrationday = . . . from ( select . . . as celebrationday . . . )
。定义它的内部查询和响应它的外部查询。
您可以完全避免使用日期名称:
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