HowTo:如何使用Oracle的Decode函数进行多值判断

本文介绍了DECODE函数的使用方法及语法结构,通过示例展示了如何根据条件返回不同结果,适用于数据库查询中对特定字段进行状态标记等场景。
Decode函数的语法结构如下:
decode (expression, search_1, result_1)
decode (expression, search_1, result_1, search_2, result_2)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n)

decode (expression, search_1, result_1, default)
decode (expression, search_1, result_1, search_2, result_2, default)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)

decode函数比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。
以下是一个简单测试,用于说明Decode函数的用法:
SQL> create table t as select username,default_tablespace,lock_date from dba_users;

Table created.

SQL> select * from t;

USERNAME                       DEFAULT_TABLESPACE             LOCK_DATE
------------------------------ ------------------------------ ---------
SYS                            SYSTEM
SYSTEM                         SYSTEM
OUTLN                          SYSTEM
CSMIG                          SYSTEM
SCOTT                          SYSTEM
EYGLE                          USERS
DBSNMP                         SYSTEM
WMSYS                          SYSTEM                         20-OCT-04

8 rows selected.


SQL> select username,decode(lock_date,null,'unlocked','locked') status from t;

USERNAME                       STATUS
------------------------------ --------
SYS                            unlocked
SYSTEM                         unlocked
OUTLN                          unlocked
CSMIG                          unlocked
SCOTT                          unlocked
EYGLE                          unlocked
DBSNMP                         unlocked
WMSYS                          locked

8 rows selected.

SQL> select username,decode(lock_date,null,'unlocked') status from t;

USERNAME                       STATUS
------------------------------ --------
SYS                            unlocked
SYSTEM                         unlocked
OUTLN                          unlocked
CSMIG                          unlocked
SCOTT                          unlocked
EYGLE                          unlocked
DBSNMP                         unlocked
WMSYS

8 rows selected.
 
如下SQL是查询上班刷卡异常,INTIME排班上班,OUTTIME排班下班, 有考勤卡,无门禁卡或门禁卡时间>=考勤卡时间,显示考勤时间对应每笔门禁时间,不使用MIN(FF_MJ.FGT02),但并未显示出有考勤无门禁卡的, 请协助修改,并优化oracle如下SQL性能,提高执行效率和减少资源占用:SELECT 'ON', BASE.WORK_DATE, '', BASE.PLANT, '', BASE.EMP_CODE, BASE.EMPNAME, BASE.RANK_NAME, BASE.ORG_CODE, BASE.ORG_NAME, BASE.EMPTYPE, BASE.DUTY_NAME, BASE.HOLIDAY, BASE.WS_NUMBER, BASE.WS_SIMPLE_NAME, BASE.DAYTYPE, BASE.INTIME, BASE.OUTTIME, KQ_REC.FGT02 AS KQ_FGT02, -- 考勤卡时间 MJ_REC.FGT02 AS MJ_FGT02, -- 每笔门禁时间 NULL AS MJ_FGT03, NULL, NULL, NULL, NULL, 'LSHR', SYSDATE, 'SP_SYNC_KQ_MJ_CARD_EXP' FROM ( SELECT T.WORK_DATE, DECODE(P.WORK_PLACE, 0, '一园', 1, '二园', 2, '三园', 'NULL') AS PLANT, T.EMP_CODE, T.EMPNAME, P.RANK_NAME, P.ORG_CODE, P.ORG_NAME, P.EMPTYPE, P.DUTY_NAME, DECODE(D.DATE_STATUS, 0, 'N', 1, 'H', 3, 'S') AS HOLIDAY, T.WS_NUMBER, T.WS_SIMPLE_NAME, DECODE(T.WS_INTERVAL, 0, '白班', 1, '晚班') AS DAYTYPE, T.INTIME, T.OUTTIME FROM HCP.LSHR_CARDING_V T JOIN HCP.TZ_EMP_IN P ON T.EMP_CODE = P.EMPCODE JOIN HCP.V_CLK_TZ_EMP_CALENDER_INFO D ON T.EMP_CODE = D.EMP_CODE AND T.WORK_DATE = D.CLD_DATE WHERE T.WORK_DATE = TRUNC(SYSDATE) - 2 ) BASE -- 考勤卡记录(必须存在) JOIN HCP.FGT_FILE_KQMJ KQ_REC ON KQ_REC.FGT10 = BASE.EMP_CODE AND KQ_REC.FGT03 = '1' AND LENGTH(KQ_REC.FGT08) = 5 AND SUBSTR(KQ_REC.FGT08, 3, 1) IN ('1','2') AND KQ_REC.FGT02 BETWEEN BASE.INTIME - 2/24 AND BASE.INTIME + 5/24 -- 门禁卡记录(左连接,允许不存在) LEFT JOIN HCP.FGT_FILE_KQMJ MJ_REC ON MJ_REC.FGT10 = BASE.EMP_CODE AND MJ_REC.FGT03 = '1' AND LENGTH(MJ_REC.FGT08) = 5 AND SUBSTR(MJ_REC.FGT08, 3, 1) = '3' AND MJ_REC.FGT02 BETWEEN BASE.INTIME - 2/24 AND BASE.INTIME + 5/24 WHERE -- 异常条件:无门禁卡或门禁时间≥考勤时间 (MJ_REC.ROWID IS NULL OR MJ_REC.FGT02 >= KQ_REC.FGT02) -- 确保考勤卡是最新记录(避免重复) AND KQ_REC.FGT02 = ( SELECT MAX(FGT02) FROM HCP.FGT_FILE_KQMJ WHERE FGT10 = BASE.EMP_CODE AND FGT03 = '1' AND LENGTH(FGT08) = 5 AND SUBSTR(FGT08, 3, 1) IN ('1','2') AND FGT02 BETWEEN BASE.INTIME - 2/24 AND BASE.INTIME + 5/24 );
最新发布
08-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值