一条查询SQL语句的问题!

dageming 2010-10-29 07:29:46
用select to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0)) from Tz_Xdxxb WHERE xlmc='05' and xd=201做查询,

查询结果为 1

然而用select xlmc,xd from Tz_Xdxxb WHERE to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))=1做查询,

查询就报“无效数字”错误

何解??高分求助!
...全文
178 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dageming 2010-11-02
  • 打赏
  • 举报
回复
我明白了,执行了
SELECT t.hc from Tz_Xdxxb t where nvl(substr(HC,INSTR(HC,'#')+1,10),'0')<>'0'
出来5条记录,4条符合规则,1条不符合规则,修改这条记录后,错误消失了!

谢谢!
gelyon 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 dageming 的回复:]

我又出来了,谢谢各位,首先HC这个字段呢是VARCHAR(20),其次呢我必须将其中#后的数字能够提取出来,要进行数字的比较操作,比方说

select xlmc,xd from Tz_Xdxxb
WHERE
to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))>=1
and
to_number(nvl(substr(HC,INSTR(……
[/Quote]


你的 SELECT nvl(substr(HC,INSTR(HC,'#')+1,10),0) from Tz_Xdxxb 查询出来的是不是除了为空的全部是数字啊???
你得确定这点啊,如果这个查询出来的结果又非数字的且不为空,那么怎么跟数字1,100作比较啊,就会报无效数字错误!
你先确认下。
再把你具体需求那些说明白一点,整理一下。
dageming 2010-11-02
  • 打赏
  • 举报
回复
我又出来了,谢谢各位,首先HC这个字段呢是VARCHAR(20),其次呢我必须将其中#后的数字能够提取出来,要进行数字的比较操作,比方说

select xlmc,xd from Tz_Xdxxb
WHERE
to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))>=1
and
to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))<100


所以呢,to_number不用不行啊
xiaobn_cn 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dageming 的回复:]
to gelyon:
substr(HC,INSTR(HC,'#')+1,10)确实是有为空的存在,所有我用了NVL把空的转为0
[/Quote]

这是不够的,nvl只能把null转为0,还在不能转为数字的字符串呢。建议改成以下代码:

select xlmc,xd from Tz_Xdxxb WHERE nvl(substr(HC,INSTR(HC,'#')+1,10),'0')='1'
yjyyjy123 2010-11-02
  • 打赏
  • 举报
回复
检查 数据格式先
minitoy 2010-11-02
  • 打赏
  • 举报
回复
既然数据中存在不能转为数字的数据,就不要转为number再判断,直接trim判断string
minitoy 2010-11-02
  • 打赏
  • 举报
回复
select xlmc,xd from Tz_Xdxxb WHERE trim(substr(HC,INSTR(HC,'#')+1,10))='1'
心中的彩虹 2010-11-02
  • 打赏
  • 举报
回复

--估计你的hc字段是定长的,所以导致这样的结果
select count(nvl(substr(HC,INSTR(HC,'#')+1,10),0)) from Tz_Xdxxb WHERE xlmc='05' and xd=201
看有多少记录

--试试这样
select xlmc,xd from Tz_Xdxxb
WHERE instr(trim(substr(HC,INSTR(HC,'#')+1,10)),'1')>0

--or
select xlmc,xd from Tz_Xdxxb
WHERE to_number(nvl(substr(trim(HC),INSTR(HC,'#')+1,10),0))=1




dageming 2010-11-02
  • 打赏
  • 举报
回复
不好意思,周末和昨天都不在公司,今天继续顶贴.

to gelyon:
substr(HC,INSTR(HC,'#')+1,10)确实是有为空的存在,所有我用了NVL把空的转为0

to dawugui:
同上

to wkc168
查询结果为1,只有1条记录


to zhuomingwang:
用 decode确实不报错了,但查不出结果




  • 打赏
  • 举报
回复
--你用这个试试
--nvl()要求字段类型一致 你这种还是用decode比较好
select xlmc,xd
from Tz_Xdxxb
WHERE to_number(decode(substr(HC,INSTR(HC,'#')+1,10),null,0))=1
47522341 2010-10-29
  • 打赏
  • 举报
回复
substr(HC,INSTR(HC,'#')
存在非数字的字符串
Dota_noney 2010-10-29
  • 打赏
  • 举报
回复
路过学习的。。。
心中的彩虹 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 dageming 的回复:]
用select to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0)) from Tz_Xdxxb WHERE xlmc='05' and xd=201做查询,

查询结果为 1

然而用select xlmc,xd from Tz_Xdxxb WHERE to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))……
[/Quote]
--看这样是什么
select substr(HC,INSTR(HC,'#')+1,10) from Tz_Xdxxb WHERE xlmc='05' and xd=201
dawugui 2010-10-29
  • 打赏
  • 举报
回复
select xlmc,xd from Tz_Xdxxb WHERE xlmc='05' and xd=201 and to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))=1


你之前的条件漏了,将一些非法数据提取出来造成错误。
gelyon 2010-10-29
  • 打赏
  • 举报
回复
或者你直接查询下这里面有什么数据,看看是否有非数字
select substr(HC,INSTR(HC,'#')+1,10) from Tz_Xdxxb
gelyon 2010-10-29
  • 打赏
  • 举报
回复
你之前是有条件的 ,如果不加,可能substr(HC,INSTR(HC,'#')+1,10)不为空含有非数字
加上条件呢:
select xlmc,xd from Tz_Xdxxb WHERE to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))=1 and xlmc='05' and xd=201;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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