oracle decode的用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle decode的用法相关的知识,希望对你有一定的参考价值。

decode(value,0,A,1,B)我要把返回的值A显示在指定的字段里,有几种写法,是不是就写在最后面?求教A要显示在C字段里,B要显示在D字段里,应该怎么写,还是写成2句

decode含义解释:
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') 记录编号 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)
参考技术A 你这句的意思是,
如果value为0则显示A,value为1则显示B
还有个写法
decode(value,0,'A',1,'B','C') 这样的话,如果不是0和1,则显示为C
话说,你写错了,A,B,C什么的是字符,要加上单引号的,否则报错

你说的什么显示在哪个字段里,没明白什么意思,你那个A,B是字段名还是字符串啊?追问

A、B我是打比方的,就当是张三、李四。请问下,比如张三、李四我要显示在C表下的name1、name2的2个字段上,我应该怎么写

追答

那应该是关联吧,跟decode无关吧,其实decode是个条件函数,跟case when用法是相同的
你追问那个还是不懂,能用个具体点的例子说吗?

本回答被提问者采纳

oracle中decode的用法,详细介绍下么,

(decode(a.mmail_no , 0 , 0 , (a.amount + a.disc_amount) *(1 + t.vat_perc / 100)))
这句话我看好长时间了没看懂。

基本语法:decode(column, resultVal, trueVal, falseVal),语义为如果Column = resultVal则结果是trueVal否则是falseVal。简单一点,可以将decode这句话转换为如下语义:
if(column = resultVal)
then
result = trueVal
else
result = falseVal
end if
相似的,将这个转换运用到你的decode就是:
if(a.mmail_no= 0)
then
result = 0
else
result = (a.amount + a.disc_amount) *(1 + t.vat_perc / 100)
end if
==================华丽的分割线====================================
当然了与oracle的decode最相近的语法是case when,转换如下:
select
case
when column = resultVal
then trueVal
else
falseVal
end
from yourtable
同样的,你的decode可以这样转换:
select
case
when a.mmail_no= 0
then 0
else
(a.amount + a.disc_amount) *(1 + t.vat_perc / 100)
end
from yourtable a
供你参考
参考技术A decode(a.mmail_no , 0 , 0 , (a.amount + a.disc_amount) *(1 + t.vat_perc / 100))
一点点分析:
对a.mmail_no进行判断。如果a.mmail_no为0 则输出结果为0,否则输出 (a.amount + a.disc_amount) *(1 + t.vat_perc / 100)

decode(列名,判断条件,符合判断条件的输出结果,不符合判断条件的输出结果)

这是decode最基本的用法。还有很多其它衍生的复杂的用法。
参考技术B 判断字段a.mmail_no如果是0 则返回0 如果不是0 返回 (a.amount + a.disc_amount) *(1 + t.vat_perc / 100)这个值 参考技术C 当a.mmail_no为0时显示为0,否则显示为(a.amount + a.disc_amount) *(1 + t.vat_perc / 100)) 参考技术D 意思是:查询a.mmail_no这个字段的值,如果是0则结果返回0,否则返回 (a.amount + a.disc_amount) *(1 + t.vat_perc / 100)这个结果。

以上是关于oracle decode的用法的主要内容,如果未能解决你的问题,请参考以下文章

decode函数的用法法请教

oracle decode函数用法

oracle decode用法

oracle decode用法

oracle decode函数用法

Oracle 中 decode 函数用法