使用 case when after when 操作数据
Posted
技术标签:
【中文标题】使用 case when after when 操作数据【英文标题】:Manipulating data using case when after when 【发布时间】:2015-03-26 05:48:10 【问题描述】:我在 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 个案例,
-
我想操纵 date_entry
之后我想操作 where date_entry > sysdate,将 date_entry 年份更改为 2010
条件如果 date_entry > sysdate 和birth
示例
案例一
date_entry < birth
01-01-2008 26-03-2015
案例 2
Date_entry > sysdate
01-01-2098 26-03-2015
案例 3
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 时需要建议。
【问题讨论】:
【参考方案1】:在 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
【讨论】:
它正在工作,谢谢,我正在将更改条款变得不那么具体以上是关于使用 case when after when 操作数据的主要内容,如果未能解决你的问题,请参考以下文章