含义解释:
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
decode(字段或字段的运算,值1,值2,值3)
这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多
使用方法:
1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()
函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)
返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
2、此函数用在SQL语句中,功能介绍如下:
Decode函数与一系列嵌套的 IF-THEN-ELSE
语句相似。base_exp
与compare1,compare2等等依次进行比较。如果base_exp和 第i 个compare项匹配,就返回第i 个对应的value 。如果base_exp与任何的compare值都不匹配,则返回default。每个compare值顺次求值,如果发现一个匹配,则剩下的compare
值(如果还有的话)就都不再求值。一个为NULL的base_exp被认为和NULL compare值等价。如果需要的话,每一个compare值都被转换成和第一个compare 值相同的数据类型,这个数据类型也是返回值的类型。
Decode
函数在实际开发中非常的有用
结合Lpad函数,如何使主键的值自动加1并在前面补0
SELECT LPAD(decode(COUNT(记录编号), 0, 1, MAX(to_number(记录编号) + 1)), 14, '0') AS 记录编号
FROM tetdmis
eg:
select decode(dir,1,0,1) from a1_interval
dir 的值是1变为0,是0则变为1
比如我要查询某班男生和女生的数量分别是多少?
通常我们这么写:
select count(*) from 表 where 性别 = 男;
select count(*) from 表 where 性别 = 女;
要想显示到一起还要union一下,太麻烦了
用decode
呢,只需要一句话
select decode(性别,男,1,0),decode(性别,女,1,0) from 表
3,order by对字符列进行特定的排序
大家还可以在Order by
中使用Decode
。
例:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。
select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, , '外语',3)
Oracle 数据库SQL中 decode()函数简介
decode()
函数简介:
主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明);
使用方法:
Select decode(columnname,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
From talbename
Where …
其中columnname为要选择的table
中所定义的column,
·含义解释:
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
的理解如下:
if (条件==值1)
then
return(翻译值1)
elsif (条件==值2)
then
return(翻译值2)
......
elsif (条件==值n)
then
return(翻译值n)
else
return(缺省值)
end if
注:其中缺省值可以是你要选择的column name 本身,也可以是你想定义的其他值,比如Other等;
举例说明:
现定义一table名为output,其中定义两个column分别为monthid(var型)和sale(number型),若sale值=1000时翻译为D,=2000时翻译为C,=3000时翻译为B,=4000时翻译为A,如是其他值则翻译为Other;
SQL如下:
Select monthid , decode (sale,1000,'D',2000,'C',3000,'B',4000,'A',’Other’) sale from output
特殊情况:
若只与一个值进行比较
Select monthid ,decode(sale, NULL,‘---’,sale) sale from output
另:decode
中可使用其他函数,如nvl
函数或sign()
函数等;
NVL(EXPR1,EXPR2)
若EXPR1
是NULL
,则返回EXPR2
,否则返回EXPR1
.
SELECT NAME,NVL(TO_CHAR(COMM),'NOT APPLICATION') FROM TABLE1;
如果用到decode
函数中就是
select monthid,decode(nvl(sale,6000),6000,'NG','OK') from output
sign()
函数根据某个值是0
、正数还是负数,分别返回0、1、-1,
如果取较小值就是select monthid,decode(sign(sale-6000),-1,sale,6000) from output
,即达到取较小值的目的。
行转列,并汇总求和
Oracle数据库中,行转列可以使用到decode
函数进行处理。
例如表t1有以下数据
合同号(hth) | 科目(kmbh) | 金额(je) | 发生日期 |
---|---|---|---|
00001 | 1 | 20 | 2015-01-02 |
00001 | 2 | 30 | 2015-01-02 |
00002 | 1 | 25 | 2015-01-02 |
00001 | 1 | 15 | 2015-01-03 |
00002 | 2 | 40 | 2015-01-03 |
00001 | 3 | 50 | 2015-01-04 |
现需要将以上数据汇总,合同下相同科目的金额汇总到一起,并将科目按列展示
合同号 | 科目01 | 科目02 | 科目03 |
---|---|---|---|
00001 | 35 | 20 | 50 |
00002 | 25 | 40 | 0 |
可使用以下SQL实现:
SELECT hth
, SUM(decode(kmbh, ’01’, je, 0)) AS 科目01
, SUM(decode(kmbh, ’02’, je, 0)) AS 科目02
, SUM(decode(kmbh, ’03’, je, 0)) AS 科目03
FROM t1
GROUP BY hth