最近调试SQL语句,总是出现 ORA-01722: invalid number 错误,查了半天才发现是decode报错,仔细研究下Oracle官网上的资料,发现了以前没有注意过的细节,就此总结下。
Oracle 官网Decode资料网址:http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions040.htm#i1017437
DECODE语法,从DECODE(expr,if1,val1,if2,val2,...,ifn,valn,default),expr,ifn, default 可以为numeric 类型(NUMBER
, BINARY_FLOAT
, or BINARY_DOUBLE
)或者character类型。
注意事项1: expr与if1,if2...ifn 的数据类型要一致,如果不一致,Oracl会自动转换expr,if2...ifn为if1的类型,如果转换不成功就会报错。
例如:
SELECT DECODE('A',1,0,1) FROM DUAL;
执行结果:
注意事项2: val2...valn和default应该与val1的类型一致,如果不一致,Oracle会自动转换val2...valn和default为val1类型,如果转换不成功就会报错。
SELECT DECODE('1','0',0,'X') FROM DUAL;
执行结果:
注意事项3: 对于DECODE函数,Oracle认为NULL与NULL是相等的。
SELECT DECODE(NULL,NULL,'SAME','NOT SAME') FROM DUAL;
执行结果: