decode 是什么意思

上一篇 / 下一篇  2008-06-29 21:37:48 / 个人分类:Oracle

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
51Testing软件测试网2NB+gd ] ULGP

DECODE(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)  
E _h/C3[ y3ne0  该函数含义如下:  
y+Sv3iI0  IF   条件=值1   THEN  51Testing软件测试网8MV8o8Tp3Hsr(r
        RETURN   (翻译值1)  51Testing软件测试网 kI|{1}ez7o
  ELSIF   条件=值2   THEN  
V8K3C.Wya(|'O Ue0        RETURN   (翻译值2)  51Testing软件测试网F*V4Xf'?7J0W?;G
        ......  
^`}#vo#}q0  ELSIF   条件=值n   THEN  51Testing软件测试网^Z A6?5F
        RETURN   (翻译值n)  51Testing软件测试网{f-_u;V1s7k
  ELSE  51Testing软件测试网r[9^uj/D#o5Sv
        RETURN   (缺省值)  51Testing软件测试网$h;e s5k s5v.{}+@
  END   IF   51Testing软件测试网)s\ fH|m
decode相当于一个if..then..else语句  
? w"man-gF4A-j0  后面一般有偶数个参数  
@1jf AVKn#k_,B0  decode(a,b1,c1,b2,c2,d)  
4}1A D&HF;`eL0  表示如果a   =   b1,则返回c1,如果a   =   b2则返回c2,       b1,b2都不满足就返回d51Testing软件测试网I?#t1plY"n

51Testing软件测试网(C d8B'pttR!Y

DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。DECODE有什么用途呢? 先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%,通常的做法是,先选出记录中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else或choose case之类的流控制语句进行判断。 如果用DECODE函数,那么我们就可以把这些流控制语句省略,通过SQL语句就可以直接完成。如下:select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee 是不是很简洁? DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。

vB"_1gq"eYn051Testing软件测试网 K+d)C$lG'`5U

  decode()函数使用技巧51Testing软件测试网4Rd/VYs \5E U^

xb6FT,jA.D"{0  ·软件环境:

'a+Da(QF9n#L|051Testing软件测试网6d}TQ8I!G:F$z

  1、Windows NT4.0+ORACLE 8.0.451Testing软件测试网7\+j)e_v T!ENH

51Testing软件测试网7@ p5GrJ

  2、ORACLE安装路径为:C:\ORANT

$x#XDqMW!CCg051Testing软件测试网(W1FY`*| LZ(A(C

  ·含义解释:

~QfZm,Bn0

4v ~ u/AN%G\{ bp0  decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)51Testing软件测试网.}CN~'O

51Testing软件测试网m"b"o;x q}8z~`H@

  该函数的含义如下:51Testing软件测试网[b2}~fYwrj

H6ML?(nm.I0  IF 条件=值1 THEN51Testing软件测试网$lD9}7e7j]*u)K

trNP7Lzy0  RETURN(翻译值1)51Testing软件测试网a E}SZ5{

1c:o }u%B({eXR0  ELSIF 条件=值2 THEN51Testing软件测试网K5M;Bn9FTq

"c&Y%K:FQ;Im0  RETURN(翻译值2)51Testing软件测试网+~&?p,|)F]y

51Testing软件测试网F6w;Hd&l?

  ......

L"DQ `!`051Testing软件测试网SCB8@+I#Z9t6xbek

  ELSIF 条件=值n THEN

f-d v*_(c1Y;].n"P0

~ |@M{-I t0  RETURN(翻译值n)

@i np`)V051Testing软件测试网 y|5kz"q;bv

  ELSE

+@9L5N6dr"k/H7~OA0

rF2P2jr0  RETURN(缺省值)51Testing软件测试网ZR5c L%IU#AC

/s \(Y+cgv6n0  END IF51Testing软件测试网&Fs/a$f;aR,^ Es%{

M L[*Y'CG1N0  · 使用方法:51Testing软件测试网%UQ^|5I iDF

C3G*b)m}0  1、比较大小51Testing软件测试网?n1m ygC

k:V"Q/zT%x2UE0  select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值

t"XRD j/N051Testing软件测试网WP5Ixk9oC

  sign()函数根据某个值是0、正数还是负数,分别返回0、1、-151Testing软件测试网^-A^vk'eG F

51Testing软件测试网(_.Z,k~A7`

  例如:51Testing软件测试网wXUf5\ n

51Testing软件测试网3yjjK/~2A_\

  变量1=10,变量2=20

8nKB@*K!Aa051Testing软件测试网3X$uN2b"r

  则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。

*[0? m,bD!t3|e#P,~&aq0

~d+O0j1K }:l"@0  2、表、视图结构转化

H8q3ZKP)D} P051Testing软件测试网_!R@wMU&i

  现有一个商品销售表sale,表结构为:51Testing软件测试网S*x3v5q.r;f

9Ay q __g0  month    char(6)      --月份51Testing软件测试网n:W)M"X2RL]

w DN'|N7{;ehA0  sell    number(10,2)   --月销售金额

d hMVV051Testing软件测试网 vPM@k#w'nq

  现有数据为:

YD)^-F&jM6Vn]0

-?&\ AC!Jb+_ Q0  200001  1000

(m k^yJ.Ta1[051Testing软件测试网*W4Gsn l@Br*S

  200002  1100

[g^1W_t~ a,GL%W3ol051Testing软件测试网"`Q9G.\t|PZ

  200003  1200

z"T#E;p,[0

2])X3Q&I.Y&F)P,{M2]}M0  200004  130051Testing软件测试网"d-yQ@;Ub1?

51Testing软件测试网{_%r/o8SA

  200005  140051Testing软件测试网/p?k-}h

u'z ?,|:|0  200006  150051Testing软件测试网kxu$[ v!N I R

51Testing软件测试网r!D X6|^8q3X~xL3e

  200007  160051Testing软件测试网Q%vO%Lsz+p4\G

51Testing软件测试网rx"PhN l6}V

  200101  1100

v4v6[8r#a MG]0

$?vnA|V7L0  200202  120051Testing软件测试网u2I k@.v5f/V*Un

51Testing软件测试网Z#cC u$Bi

  200301  130051Testing软件测试网 Dv4f-Q X;LJq}Wz

D+{P5@cK~-E0  想要转化为以下结构的数据:51Testing软件测试网+S U1f:Oj'[C/_

KD`1Vsf1[3t6xX0  year   char(4)      --年份51Testing软件测试网9Y6x b f2vA-D+JdW

;AMuw&~Ak8De2g0  month1  number(10,2)   --1月销售金额

.?g5E~*j*{051Testing软件测试网5o5|U*G)u&w&I

  month2  number(10,2)   --2月销售金额51Testing软件测试网/}xS+k&y8~D

n_Rh V t;T0  month3  number(10,2)   --3月销售金额51Testing软件测试网 z v"[P7r]

51Testing软件测试网h-}4Z.n2G3J)w

  month4  number(10,2)   --4月销售金额

b[:KQ,OF051Testing软件测试网*i-a?8m0d Zx

  month5  number(10,2)   --5月销售金额51Testing软件测试网Sgxhf0e

.m%`Bo'A4Xd[/K0  month6  number(10,2)   --6月销售金额

2`*tg?SM2Lxw0

aJF-np`V0  month7  number(10,2)   --7月销售金额

TEt(dI`051Testing软件测试网4v9cF1U/N\2m"iI

  month8  number(10,2)   --8月销售金额51Testing软件测试网1a5kP"N%N[d

0r _2`5H,Qxl9zB9m0  month9  number(10,2)   --9月销售金额51Testing软件测试网"SR\o.CQ%@

vBNG U|@Yz|I3`0  month10  number(10,2)   --10月销售金额51Testing软件测试网bKlG*Y3L3K'ic0o

51Testing软件测试网 hwt+e3R h

  month11  number(10,2)   --11月销售金额51Testing软件测试网 E3c@,kmy

o$H#g0NEB,Q0  month12  number(10,2)   --12月销售金额51Testing软件测试网q2]"{ K;r? _

\$z5Zw(OXAa#QI?0  结构转化的SQL语句为:

|!U"y] kW051Testing软件测试网)\uGh/T5fum!y#Mg

  create or replace view51Testing软件测试网)x5P(_n$u Q

jRP {oe0  v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)51Testing软件测试网9Os(S-D1rRi(Vv

BV.I5vI;u a0  as51Testing软件测试网w OGd)`p

Vy_,Q%A0  select

Du u&a7WG%s0

'z/_r_\2Gi1H'W r*I7B0  substrb(month,1,4),51Testing软件测试网KD4kksA

51Testing软件测试网v'Y Se n8Z,u.OzL

  sum(decode(substrb(month,5,2),'01',sell,0)),

L1LT@eZFa$F051Testing软件测试网/j qt IilS$Sq

  sum(decode(substrb(month,5,2),'02',sell,0)),51Testing软件测试网 T{1m Wwi

'O*^8qZ6tn:|i&}0  sum(decode(substrb(month,5,2),'03',sell,0)),

9f#H&}T+C8}0

\ }u w/gL0  sum(decode(substrb(month,5,2),'04',sell,0)),

y@`cSk0

TAG: oracle Oracle

 

评分:0

我来说两句

Open Toolbar