OceanBase DECODE
DECODE
函数依次用参数 search
与 condition
做比较,直至 condition
与 search
的值相等,则返回对应 search
后跟随的参数 result
的值。如果没有 search
与 condition
相等,则返回参数 default
的值。
语法
DECODE (condition, search 1, result 1, search 2, result 2 ... search n, result n, default)
DECODE
函数的含义可以用 IF...ELSE IF...END
语句进行解释:
IF condition = search 1 THEN
RETURN(result 1)
ELSE IF condition = search 2 THEN
RETURN(result 2)
......
ELSE IF condition = search n THEN
RETURN(result n)
ELSE
RETURN(default)
END IF
参数
参数 |
说明 |
---|---|
condition、search 1...search n、result 1...result n、default |
数值型( |
search 1
~ search n
不能为条件表达式,这种情况只能用 CASE WHEN THEN END
语句解决:
WHEN CASE condition = search 1 THEN
RETURN(result 1)
ELSE CASE condition = search 2 THEN
RETURN(result 2)
......
ELSE CASE condition = search n THEN
RETURN(result n)
ELSE
RETURN(default)
END
示例
示例 1: 使用 DECODE
比较数值的大小。
以下语句使用 DECODE
函数来返回数值 10 与 20 当中较小的那个数。SIGN()
函数用来计算两个值差的符号,由于 10 小于 20,所以差为负数,SIGN()
返回 -1。此时 DECODE
函数将参数 -1 与 SIGN()
函数的返回值作比较。相等时,返回值 10,不相等时,返回值
20:
SELECT DECODE(SIGN(10-20),-1,10,20) FROM DUAL;
返回结果如下:
+------------------------------+
| DECODE(SIGN(10-20),-1,10,20) |
+------------------------------+
| 10 |
+------------------------------+
示例 2:使用 DECODE
函数查看数据中是否包含字符 S。
以下语句创建了表 EMP,表中包含列 ename 和 sal,并向其中插入值:
CREATE TABLE EMP(ename VARCHAR(30),sal NUMBER);
INSERT INTO EMP VALUES('CLARK', 2750);
INSERT INTO EMP VALUES('KING', 5300);
INSERT INTO EMP VALUES('MILLER', 1600);
INSERT INTO EMP VALUES('ADAMS', 1400);
INSERT INTO EMP VALUES('FORD', 3300);
INSERT INTO EMP VALUES('JONES', 3275);
INSERT INTO EMP VALUES('SCOTT', 3300);
INSERT INTO EMP VALUES('SMITH', 1100);
INSERT INTO EMP VALUES('ALLEN', 1900);
INSERT INTO EMP VALUES('BLAKE', 3150);
INSERT INTO EMP VALUES('JAMES', 1250);
INSERT INTO EMP VALUES('MARTIN', 1550);
INSERT INTO EMP VALUES('TURNER', 1800);
INSERT INTO EMP VALUES('WARD', 1550);
以下语句通过函数 INSTR()
返回字符 S 在列 ename 的值中出现的位置,若没有出现过则返回 0。此时 DECODE
函数将 INSTR
函数的返回值与 0 做比较,相等时说明字符 S 在值中没有出现过,则 DECODE
函数返回值 不含有 S,否则返回值 含有 S :
SELECT ENAME, SAL, DECODE(INSTR(ename, 'S'), 0, '不含有 S', '含有 S') AS INFO FROM EMP;
查询结果如下:
+--------+------+------------+
| ENAME | SAL | INFO |
+--------+------+------------+
| CLARK | 2750 | 不含有 S |
| KING | 5300 | 不含有 S |
| MILLER | 1600 | 不含有 S |
| ADAMS | 1400 | 含有 S |
| FORD | 3300 | 不含有 S |
| JONES | 3275 | 含有 S |
| SCOTT | 3300 | 含有 S |
| SMITH | 1100 | 含有 S |
| ALLEN | 1900 | 不含有 S |
| BLAKE | 3150 | 不含有 S |
| JAMES | 1250 | 含有 S |
| MARTIN | 1550 | 不含有 S |
| TURNER | 1800 | 不含有 S |
| WARD | 1550 | 不含有 S |
+--------+------+------------+