全部产品

DECODE

更新时间:2020-03-26 18:45:08

DECODE 函数依次用参数 searchcondition 做比较,直至 conditionsearch 的值相等,则返回对应 search 后跟随的参数 result 的值。如果没有 searchcondition 相等,则返回参数 default 的值。

语法

  1. DECODE (condition, search 1, result 1, search 2, result 2 ... search n, result n, default)

DECODE 函数的含义可以用 IF...ELSE IF...END 语句进行解释:

  1. IF condition = search 1 THEN
  2. RETURN(result 1)
  3. ELSE IF condition = search 2 THEN
  4. RETURN(result 2)
  5. ......
  6. ELSE IF condition = search n THEN
  7. RETURN(result n)
  8. ELSE
  9. RETURN(default)
  10. END IF

参数

参数 说明
condition、search 1…search n、result 1…result n、default 数值型(NUMBERFLOATBINARY_FLOATBINARY_DOUBLE)或字符型( CHARVARCHAR2NCHARNVARCHAR2)的表达式。

注意search 1 ~ search n 不能为条件表达式,这种情况只能用 CASE WHEN THEN END 语句解决:

  1. WHEN CASE condition = search 1 THEN
  2. RETURN(result 1)
  3. ELSE CASE condition = search 2 THEN
  4. RETURN(result 2)
  5. ......  
  6. ELSE CASE condition = search n THEN
  7. RETURN(result n)
  8. ELSE
  9. RETURN(default)
  10. END

示例

示例 1: 使用 DECODE 比较数值的大小。

以下语句使用 DECODE 函数来返回数值 10 与 20 当中较小的那个数。SIGN() 函数用来计算两个值差的符号,由于 10 小于 20,所以差为负数,SIGN() 返回 -1。此时 DECODE 函数将参数 -1 与 SIGN() 函数的返回值作比较。相等时,返回值 10,不相等时,返回值 20:

  1. SELECT DECODE(SIGN(10-20),-1,10,20) FROM DUAL;

返回结果如下:

  1. +------------------------------+
  2. | DECODE(SIGN(10-20),-1,10,20) |
  3. +------------------------------+
  4. | 10 |
  5. +------------------------------+

示例 2:使用 DECODE 函数查看数据中是否包含字符 S

以下语句创建了表 EMP,表中包含列 enamesal,并向其中插入值:

  1. CREATE TABLE EMP(ename VARCHAR(30),sal NUMBER);
  2. INSERT INTO EMP VALUES('CLARK', 2750);
  3. INSERT INTO EMP VALUES('KING', 5300);
  4. INSERT INTO EMP VALUES('MILLER', 1600);
  5. INSERT INTO EMP VALUES('ADAMS', 1400);
  6. INSERT INTO EMP VALUES('FORD', 3300);
  7. INSERT INTO EMP VALUES('JONES', 3275);
  8. INSERT INTO EMP VALUES('SCOTT', 3300);
  9. INSERT INTO EMP VALUES('SMITH', 1100);
  10. INSERT INTO EMP VALUES('ALLEN', 1900);
  11. INSERT INTO EMP VALUES('BLAKE', 3150);
  12. INSERT INTO EMP VALUES('JAMES', 1250);
  13. INSERT INTO EMP VALUES('MARTIN', 1550);
  14. INSERT INTO EMP VALUES('TURNER', 1800);
  15. INSERT INTO EMP VALUES('WARD', 1550);

以下语句通过函数 INSTR 返回字符 S 在列 ename 的值中出现的位置,若没有出现过则返回 0。此时 DECODE 函数将 INSTR 函数的返回值与 0 做比较,相等时说明字符 S 在值中没有出现过,则 DECODE 函数返回值 不含有 S,否则返回值 含有 S

  1. SELECT ENAME, SAL, DECODE(INSTR(ename, 'S'), 0, '不含有 S', '含有 S') AS INFO FROM EMP;

查询结果如下:

  1. +--------+------+------------+
  2. | ENAME | SAL | INFO |
  3. +--------+------+------------+
  4. | CLARK | 2750 | 不含有 S |
  5. | KING | 5300 | 不含有 S |
  6. | MILLER | 1600 | 不含有 S |
  7. | ADAMS | 1400 | 含有 S |
  8. | FORD | 3300 | 不含有 S |
  9. | JONES | 3275 | 含有 S |
  10. | SCOTT | 3300 | 含有 S |
  11. | SMITH | 1100 | 含有 S |
  12. | ALLEN | 1900 | 不含有 S |
  13. | BLAKE | 3150 | 不含有 S |
  14. | JAMES | 1250 | 含有 S |
  15. | MARTIN | 1550 | 不含有 S |
  16. | TURNER | 1800 | 不含有 S |
  17. | WARD | 1550 | 不含有 S |
  18. +--------+------+------------+