表字段的非空非0判断无效

phoenixLotus 2015-12-21 05:31:30
表table_a 里面有个字段 filed_a number类型 可为0,null及其他值。
写了一个sql
select case when filed_a is null then 1 when filed_a=0 then 1 else 1/filed_a end from table_a
但是这个会报除数为0错。
我想请教下各位老师,为什么,不是做了判断么,还会报除数为0呢。
该如何解决这个问题呢。
非常感谢。。
...全文
299 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenglongyi 2015-12-24
  • 打赏
  • 举报
回复
mayanzs 2015-12-24
  • 打赏
  • 举报
回复

select case when filed_a is null then 1 when filed_a=0 end from table_a where filed_a is null or filed_a=0
union all
select 1/filed_a from table_a where nvl(filed_a,0)<>0
wanggang_sql 2015-12-24
  • 打赏
  • 举报
回复
这个没问题呀,不报错的。
phoenixLotus 2015-12-21
  • 打赏
  • 举报
回复
非常感谢版主以及2楼兄弟的回复。 那条数据 我也根据id查出来看过,filed_a确实就是0.以前我经常用也没遇到过这样的问题。 to2楼的兄弟,table_a 肯定就是一个表 filed_a也是这个表的一列,跟我这里写的唯一的区别 可能就是 我那边用了多表关联查询。 也改用decode试过,结果是一样的。。真是第一次遇到。只有再根据版主提供的方法再去抓出来看下了。 太感谢了
卖水果的net 2015-12-21
  • 打赏
  • 举报
回复
这个问题有些怪。 感觉 table_a ,不是一张表,而是一张视图,并且 filed_a 是一个计算列。
小灰狼W 2015-12-21
  • 打赏
  • 举报
回复
把那条数据抓出来看看 DECLARE v_num NUMBER; BEGIN FOR x IN(SELECT t.*,t.rowid rid FROM table_a t)LOOP BEGIN SELECT CASE WHEN filed_a IS NULL THEN 1 WHEN filed_a=0 THEN 1 ELSE 1/filed_a END INTO v_num FROM table_a WHERE ROWID=x.rid; EXCEPTION WHEN ZERO_DIVIDE THEN dbms_output.put_line('就是它了: '||x.filed_a||'; rowid '||ROWIDTOCHAR(x.rid)); WHEN OTHERS THEN dbms_output.put_line(SQLERRM); END; END LOOP; END;
-- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、select ename, sal * 12 from emp; --计算年薪 2、select 2*3 from dual; --计算一个比较纯的数据用dual 3、select sysdate from dual; --查看当前的系统时间 4、select ename, sal*12 anuual_sal from emp; --给搜索字段更改名称(双引号 keepFormat 别名有特殊字符,要加双引号)。 5、--任何含有空值的数学达式,最后的计算结果都是空值。 6、select ename||sal from emp; --(将sal的查询结果转化为字符串,与ename连接到一起,相当于Java中的字符串连接) 7、select ename||'afasjkj' from emp; --字符串的连接 8、select distinct deptno from emp; --消除deptno字段重复的值 9、select distinct deptno , job from emp; --将与这两个字段都重复的值去掉 10、select * from emp where deptno=10; --(条件过滤查询) 11、select * from emp where empno > 10; --大于 过滤判断 12、select * from emp where empno 10 --不等于 过滤判断 13、select * from emp where ename > 'cba'; --字符串比较,实际上比较的是每个字符的AscII值,与在Java中字符串的比较是一样的 14、select ename, sal from emp where sal between 800 and 1500; --(between and过滤,包含800 1500) 15、select ename, sal, comm from emp where comm is null; --(选择comm字段为null的数据) 16、select ename, sal, comm from emp where comm is not null; --(选择comm字段不为null的数据) 17、select ename, sal, comm from emp where sal in (800, 1500,2000); --(in 范围) 18、select ename, sal, hiredate from emp where hiredate > '02-2月-1981'; --(只能按照规定的格式写) 19、select ename, sal from emp where deptno =10 or sal >1000; 20、select ename, sal from emp where deptno =10 and sal >1000; 21、select ename, sal, comm from emp where sal not in (800, 1500,2000); --(可以对in指定的条件进行取反) 22、select ename from emp where ename like '%ALL%'; --(模糊查询) 23、select ename from emp where ename like '_A%'; --(取第二个字母是A的所有字段) 24、select ename from emp where ename like '%/%%'; --(用转义字符/查询字段中本身就带%字段的) 25、select ename from emp where ename like '%$%%' escape '$'; --(用转义字符/查询字段中本身就带%字段的) 26、select * from dept order by deptno desc; (使用order by desc字段 对数据进行降序排列 默认为升序asc); 27、sel

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧