oracle decode函数

Posted

tags:

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

orcl@ SCOTT> SELECT empno, DECODE(ename,job ,sal,ename ) cost FROM emp1;
SELECT empno, DECODE(ename,job ,sal,ename ) cost FROM emp1
*
ERROR at line 1:
ORA-01722: invalid number
为什么decode函数的最后一个表达式要求为数字类型呢

--楼主 我来告诉你吧
--你的语句的意思是 当ename字段等于job字段的值时 把值置为 sal 你这个sal应该是一个字段名
--否则 就返回他自己的值 所以你的报错是因为 ename和另外两个字段的数据类型不一致
--也就是说ename,job ,sal 这三个数据类型要一致 必须一致 你可以检查一下 处理好这个就可以了
--DECODE(ename,job ,sal,ename ) 这隐性判断是 当ename=job 把ename=sal 否则 就等于他
--本身 所以 这三个数据类型要一致
--有什么问题可以随时找我 希望采纳追问

如果把原语句最后一段从字符变为数字类型的话,就可以执行了,或者吧第三个字段变成字符的也可以。
SELECT empno, DECODE(ename,job ,to_char(sal),ename ) cost FROM emp1;

SELECT empno, DECODE(ename,job ,sal,deptno ) cost FROM emp1;

追答

不太可能吧 本身等于本身肯定没有问题

可能问题是 这个是一个虚拟列 数据类型 有新数据决定
如果sal是数字类型的话 那么我的判断就是对的
因为新字段cost的值是to_char(sal)和ename 或者sal,deptno 只要两者数据类型统一就可以

我前面说的有些偏差

参考技术A 楼上说的都是对的,但没有点明重点。
正如所说的,
SELECT empno, DECODE(ename,job ,to_char(sal),ename ) cost FROM emp1;
SELECT empno, DECODE(ename,job ,sal,deptno ) cost FROM emp1;
这里数据类型要匹配的有2对
第一个是 ename 和job 因为decode的判断条件就是ename = job
第二个是 sal和ename 因为 若相等 其值为sal 若不等 其值为ename
这里 就会出现类型不匹配 。
这里还有个误区 ,该栏位最后的值的类型已经不是ename 所决定的,而是sal来决定。
所以你的两种改法,都是将最后的两个值的类型改成一样的了,你也可以重新换个类型的2个值来试一下。
希望对你有帮助。
参考技术B decode(表中字段,如果是某个值,那么返回X,如果是另一个值,那么返回Y);
类似于 case when then end 或者 if else if else
例如:String str = "";
if ("jack".equals(ename))
str = "jack";
else
str = "other";

System.out.println(str);
参考技术C SELECT empno, DECODE(ename,job ,to_char(sal),ename ) cost FROM emp1;

你前后的数据类型不一致才报的错。追问

不是很明白什么意思, 第三个值 应该是当第一个值与第二个值相等时 ,用来返回的。 这个默认的返回值之间有什么关系啊。
你指的 数据类型不一致 值得是和那个数据类型不一致呢
谢谢

追答

sal是数字类型,ename是字符类型,二者类型相同才行。

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

关于Oracle的decode函数

oracle decode 在access中有别的函数能代替吗?

oracle中decode函数有啥用?

Oracle decode函数

oracle decode函数用法

Oracle自我补充之Decode()函数使用介绍