在 when 之后使用 case when 操作数据

Manipulating data using case when after when

我在 SQL Oracle 中遇到日期操作问题。这是一些代码。假设我有 3 列

Create table anom1(
NAMEID, VARCHAR(20),
DATE_ENTRY, VARCHAR(20),
BIRTH DATE
)

这里是 nameid、date_entry 和 birth

的值
INSERT INTO ANOM1(NAMEID,DATE_ENTRY,BIRTH) VALUES('3404077803080028','12-03-2008',TO_DATE('26-07-1987','DD-MM-YYYY'));
INSERT INTO ANOM1(NAMEID,DATE_ENTRY,BIRTH) VALUES('3404012303080028','01-01-2098',TO_DATE('26-07-2014','DD-MM-YYYY'));
INSERT INTO ANOM1(NAMEID,DATE_ENTRY,BIRTH) VALUES('3404013303080028','01-01-2008',TO_DATE('26-07-2013','DD-MM-YYYY'));
INSERT INTO ANOM1(NAMEID,DATE_ENTRY,BIRTH) VALUES('3404012303080028','01-01-2098',TO_DATE('26-07-1999','DD-MM-YYYY'));

我有3个案例,

  1. 我想操纵 date_entry < 出生日期,更改 date_entry 替换出生年份 +1
  2. 之后我想操作 where date_entry > sysdate,将 date_entry 年更改为 2010
  3. 条件 if date_entry > sysdate and birth < 5(1-4 岁) 与 numb 1
  4. 相同的条件

例子

案例一

date_entry < birth
01-01-2008  26-03-2015

案例二

Date_entry > sysdate
01-01-2098  26-03-2015

案例三

Date_entry > sysdate and birth < year 
26-07-2014  01-01-2098  (01-01-2010) date_entry_dummy

我的作品:

SELECT NAMEID,BIRTH,DATE_ENTRY,
CASE WHEN DATE_ENTRY < BIRTH THEN
REPLACE(DATE_ENTRY,SUBSTR(DATE_ENTRY,7,4),(EXTRACT(YEAR FROM BIRTH)+1))
WHEN DATE_ENTRY > SYSDATE THEN
REPLACE(DATE_ENTRY,SUBSTR(DATE_ENTRY,7,4),2010)
WHEN DATE_ENTRY > SYSDATE AND TRUNC(FLOOR(MONTHS_BETWEEN(SYSDATE,BIRTH)/12))< 5 THEN
REPLACE(DATE_ENTRY,SUBSTR(DATE_ENTRY,7,4),(EXTRACT(YEAR FROM BIRTH)+1))
ELSE DATE_ENTRY
END DATE_ENTRY_DUMMY FROM ANOM1;

这是失败的结果:

NAMEID              | BIRTH     | DATE ENTRY | DATE_ENTRY DUMMY
3404077803080028     26-07-1987   12-03-2008       12-03-2008
3404012303080028     26-07-2014   01-01-2098       01-01-2010
3404013303080028     26-07-2013   01-01-2008       01-01-2014
3404012303080028     26-07-1999   01-01-2098       01-01-2010

如何让年变成这样:

NAMEID              | BIRTH     | DATE ENTRY | DATE_ENTRY DUMMY
3404077803080028     26-07-1987   12-03-2008       12-03-2008
3404012303080028     26-07-2014   01-01-2098       01-01-2015
3404013303080028     26-07-2013   01-01-2008       01-01-2014
3404012303080028     26-07-1999   01-01-2098       01-01-2010

在条件 SQL 时需要建议。

在 CASE 语句中,每个 when 子句按顺序求值,直到找到匹配项。所以在你的情况下 WHEN DATE_ENTRY > SYSDATE 总是会在 WHEN DATE_ENTRY > SYSDATE AND TRUNC(FLOOR(MONTHS_BETWEEN(SYSDATE,BIRTH)/12))< 5 被评价。

如果您将 when 子句从更具体到更不具体排序,您将获得所需的结果。

附带说明一下,小心隐式转换。您应该将 date_entry 字段转换为日期,否则具有不同 NLS 设置的客户端可能会得到不同的结果。

所以使用TO_DATE(DATE_ENTRY,'dd-mm-yyyy') > SYSDATE