decode函数的几种用法

decode的几种用法

0.突然想到之前面试的一道题,以前一直不知道怎么弄,现在发现可以用decode解决。题目大概是这样的,一张student表中,按名字排序(默认拼音的首字母),但是想将其中一个叫’吴鹏’的同学,放到第一个,而其他同学的顺序依然不变,方法如下:

0.select sname,decode(sname,‘吴鹏’,1,2) from student order by decode(sname,‘吴鹏’,1,2),sname;

分析,通过decode函数,相当于给表加了一个字段用于排序,叫’吴鹏’的同学则为1,其他的则为2,默认升序排序,然后再通过sname排序,则为2的其他同学会继续按照顺序排列,这样就实现了调整排序的效果。

1.使用decode判断字符串是否一样
DECODE(value,if1,then1,if2,then2,if3,then3,…,else)
含义为
IF 条件=值1 THEN
    RETURN(value 1)
ELSIF 条件=值2 THEN
    RETURN(value 2)
    …
ELSIF 条件=值n THEN
    RETURN(value 3)
ELSE
    RETURN(default)
END IF

sql测试
select empno,decode(empno,7369,‘smith’,7499,‘allen’,7521,‘ward’,7566,‘jones’,‘unknow’) as name from emp where rownum<=10
输出结果
7369 smith
7499 allen
7521 ward
7566 jones
7654 unknow
7698 unknow
7782 unknow
7788 unknow
7839 unknow

2.使用decode比较大小select decode(sign(var1-var2),-1,var 1,var2) from dual
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
sql测试
select decode(sign(100-90),-1,100,90) from dual
输出结果
90
100-90=10>0 则会返回1,所以decode函数最终取值为90
反正
select decode(sign(100-90),1,100,90) from dual
输出结果
100
100-90=10>0返回1,判断结果为1,返回第一个变量100,最终输出结果为100

3:使用decode函数分段工资大于5000为高薪,工资介于3000到5000为中等,工资小于3000为低薪
sql测试
SELECT
ename,sal,
DECODE(SIGN(sal - 5000),
1,
‘high sal’,
0,
‘high sal’,
- 1,
DECODE(SIGN(sal - 3000),
1,
‘mid sal’,
0,
‘mid sal’,
- 1,
DECODE(SIGN(sal - 1000),
1,
‘low sal’,
0,
‘low sal’,
- 1,
‘low sal’)))
FROM
emp
输出结果
SMITH 800
low sal
ALLEN 1600
low sal
WARD 1250
low sal
JONES 2975
low sal
MARTIN 1250
low sal
BLAKE 2850
low sal
CLARK 2450
low sal
SCOTT 3000
mid sal
KING 5000
high sal
TURNER 1500
low sal
ADAMS 1100
low sal
JAMES 950
low sal
FORD 3000
mid sal
MILLER 1300
low sal

4:利用decode实现表或者试图的行列转换sql测试
SELECT
SUM(DECODE(ENAME,‘SMITH’,SAL,0)) SMITH,
SUM(DECODE(ENAME,‘ALLEN’,SAL,0)) ALLEN,
SUM(DECODE(ENAME,‘WARD’,SAL,0)) WARD,
SUM(DECODE(ENAME,‘JONES’,SAL,0)) JONES,
SUM(DECODE(ENAME,‘MARTIN’,SAL,0)) MARTIN FROM EMP
输出结果如下
SMITH ALLEN WARD JONES MARTIN
800 1600
1250 2975 1250

5:使用decode函数来使用表达式来搜索字符串decode (expression, search_1, result_1, search_2, result_2, …, search_n, result_n, default)
decode函数比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。
sql测试
SELECT
ENAME,
SAL,
DECODE(INSTR(ENAME, ‘S’),
0,
‘不含有s’,
‘含有s’) AS INFO
FROM
EMP
输出结果
SMITH 800
含有s
ALLEN 1600
不含有s
WARD 1250
不含有s
JONES 2975
含有s
MARTIN 1250
不含有s
BLAKE 2850
不含有s
CLARK 2450
不含有s
SCOTT 3000
含有s
KING 5000
不含有s
TURNER 1500
不含有s
ADAMS 1100
含有s
JAMES 950
含有s
FORD 3000
不含有s
MILLER 1300
不含有s

原文:https://blog.csdn.net/weeknd/article/details/71157044

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值