子查询报错 ORA:01722

[复制链接]
查看11 | 回复9 | 2012-6-20 17:38:14 | 显示全部楼层 |阅读模式
我有个SQL语句,子查询里如果加上转换函数就报错,但是单独把子查询拿出来执行,就没问题:
1、执行整个SQL报错,说无效数字:
SQL> SELECT DEPTID FROM T_DEPT WHERE FLAG = 1
2START WITH DEPTID IN (SELECT to_number(c.KEY) FROM T_CONST c WHERE c.CODE = 'baseinfo_report' AND c.NOTE = 'COMPANY_ID')
3CONNECT BY PRIOR DEPTID = PARENT;
START WITH DEPTID IN (SELECT to_number(c.KEY) FROM T_CONST c WHERE c.CODE = 'baseinfo_report' AND c.NOTE = 'COMPANY_ID')

*
ERROR at line 2:
ORA-01722: 无效数字
2、单独执行子查询,to_number函数正常,返回值正常
SQL> SELECT to_number(c.KEY) FROM T_CONST c WHERE c.CODE = 'baseinfo_report' AND c.NOTE = 'COMPANY_ID';
TO_NUMBER(C.KEY)
----------------
417118
479437
767
3、如果不转换子查询中的字段,转换主SQL的字段,则可以:
SQL> SELECT DEPTID FROM T_SYS_DEPT WHERE FLAG = 1
2START WITH to_char(DEPTID) IN (SELECT c.KEY FROM T_SYS_CONST c WHERE c.CODE = 'baseinfo_report' AND c.NOTE = 'COMPANY_ID')
3CONNECT BY PRIOR DEPTID = PARENT;
DEPTID
----------
767
843
1088
1089
1090
1091
1092
1093
440505
417118
440449
DEPTID
----------
440450
474295
474297
474301
483211
483212
483213
479437
19 rows selected.
明明子查询返回的值都是可以转成number型的,为什么在第一个SQL中就报错呢?

回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
发生了查询转换
加个条件应该就可以了
SELECT to_number(c.KEY) FROM T_CONST c WHERE c.CODE = 'baseinfo_report' AND c.NOTE = 'COMPANY_ID' AND rownum>0
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
SQL> SELECT to_number(c.KEY),length(c.key) FROM T_SYS_CONST c WHERE c.CODE = 'baseinfo_report' AND c.NOTE = 'COMPANY_ID';
TO_NUMBER(C.KEY) LENGTH(C.KEY)
---------------- -------------

417118
6

767
3

479437
6
也没发现返回值中间有空格什么的。
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
对啊,SQL并不是单独执行你那子查询的,而是把你的SQL子查询改造了一下,表拿出来,改成JOIN,行不行?等价改写,这样你就不能保证初次出来的全是数字了,那当然就错了
SQL在ORACLE里执行,很多是经过查询转换器改造的
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
其实很简单,看看计划就OK乐
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
dingjun123 发表于 2012-5-31 16:47
对啊,SQL并不是单独执行你那子查询的,而是把你的SQL子查询改造了一下,表拿出来,改成JOIN,行不行?等价 ...

多谢兔子,确实好使。


回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
START WITH 应该跟具体的值,而不是字段名DEPTID,SQL把DEPTID转换为数字的时候出错了
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
kerlion 发表于 2012-5-31 17:03
START WITH 应该跟具体的值,而不是字段名DEPTID,SQL把DEPTID转换为数字的时候出错了

他要多个root,那就是subquery啊
回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
dingjun123 发表于 2012-5-31 17:09
他要多个root,那就是subquery啊

是的,是有多个root。

回复

使用道具 举报

千问 | 2012-6-20 17:38:14 | 显示全部楼层
可有多个root吗?看这样会报错不
START WITH DEPTID IN(1,2,3)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行