查看: 16041|回复: 33

TO_NUMBER(SUBSTR(...)) 不能在where子句中使用吗?

[复制链接]
论坛徽章:
64
会员2007贡献徽章
日期:2007-09-26 18:42:10NBA常规赛纪念章
日期:2008-04-18 19:48:16欧洲冠军杯纪念徽章
日期:2008-05-23 14:31:342009新春纪念徽章
日期:2009-01-04 14:52:28NBA常规赛纪念章
日期:2009-04-16 14:28:42NBA季后赛纪念徽章
日期:2009-06-16 11:28:172010新春纪念徽章
日期:2010-01-04 08:33:08
跳转到指定楼层
1#
发表于 2006-12-7 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
linux as3.0  + oracle9.2.0.4

SQL> select count(*) from (select TO_NUMBER(SUBSTR(PARTITION_NAME,6)) from user_tab_partitions) ;

  COUNT(*)
----------
       920

SQL>  select count(*) from user_tab_partitions
  2  where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182;
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182
                *
ERROR at line 2:
ORA-01722: invalid number


SQL>
请问这是为什么?
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
2#
发表于 2006-12-7 18:09 | 只看该作者
select count(*) from (select TO_NUMBER(SUBSTR(PARTITION_NAME,6))  col  from user_tab_partitions)  t;加上列别名和子查询的表别名看看!

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
3#
发表于 2006-12-7 19:24 | 只看该作者
[php]
SQL> select to_number('a') from dual;
select to_number('a') from dual
                 *
ERROR 位于第 1 行:
ORA-01722: 无效数字


SQL> select count(*) from (select to_number('a') from dual);

  COUNT(*)
----------
         1

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE    9.2.0.1.0       Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production

...
[/php]

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
4#
发表于 2006-12-7 19:25 | 只看该作者

原因大抵如此吧:

[php]
SQL> explain plan for
  2  select count(*) from (select to_number('a') from dual);

已解释。

SQL> @PLAN

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------

--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |       |       |       |
|   1 |  SORT AGGREGATE      |             |       |       |       |
|   2 |   TABLE ACCESS FULL  | DUAL        |       |       |       |
--------------------------------------------------------------------

Note: rule based optimization
..
[/php]

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
5#
发表于 2006-12-7 19:27 | 只看该作者
[php]
SQL> select * from  (select to_number('a') from dual);
select * from  (select to_number('a') from dual)
                                 *
ERROR 位于第 1 行:
ORA-01722: 无效数字

可以看出:如果外层查询只想或许一个内层查询的记录数的话,那么内层的表达式是不被计算的,直接统计内层表的记录数;
反之,如果希望获取内容,则表达式必然要求值,此时才发现错误;

..
[/php]
Oracle的语义分析功能蛮强啊。。。。

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:342010新春纪念徽章
日期:2010-03-01 11:19:50
6#
发表于 2006-12-7 19:32 | 只看该作者
同意楼上兄弟的看法

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
7#
发表于 2006-12-7 19:59 | 只看该作者
很显然,第一个TO_NUMBER根本没有执行,你可以改成TO_DATE试试

使用道具 举报

回复
论坛徽章:
81
青年奥林匹克运动会-马术
日期:2014-09-10 21:37:07奥运会纪念徽章:跳水
日期:2012-09-22 18:27:58奥运会纪念徽章:现代五项
日期:2012-09-07 17:33:44奥运会纪念徽章:铁人三项
日期:2012-06-15 21:27:24版主1段
日期:2012-05-15 15:24:11蜘蛛蛋
日期:2012-05-14 10:50:40灰彻蛋
日期:2012-03-06 19:24:222012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:37
8#
发表于 2006-12-8 08:53 | 只看该作者
以前一直没注意到这个细节

使用道具 举报

回复
论坛徽章:
64
会员2007贡献徽章
日期:2007-09-26 18:42:10NBA常规赛纪念章
日期:2008-04-18 19:48:16欧洲冠军杯纪念徽章
日期:2008-05-23 14:31:342009新春纪念徽章
日期:2009-01-04 14:52:28NBA常规赛纪念章
日期:2009-04-16 14:28:42NBA季后赛纪念徽章
日期:2009-06-16 11:28:172010新春纪念徽章
日期:2010-01-04 08:33:08
9#
 楼主| 发表于 2006-12-8 10:30 | 只看该作者
最初由 yangtingkun 发布
[B]很显然,第一个TO_NUMBER根本没有执行,你可以改成TO_DATE试试 [/B]


SQL>select TO_NUMBER(SUBSTR(PARTITION_NAME,6)) from user_tab_partitions;
......
                                494
                                495
                                495
                                496
                                496
                                497
                                497
                                498
                                498
                                499
                                499
                                500
                                500

920 rows selected.

SQL>
就是执行了也没有问题。我保证分区名都是由'PART_'||一个数字  
组成的,可为什么TO_NUMBER(SUBSTR(PARTITION_NAME,6))放在where子句中就报错呢?
SQL> select count(*) from user_tab_partitions
2 where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182;
where TO_NUMBER(SUBSTR(PARTITION_NAME,6))<=182
*
ERROR at line 2:
ORA-01722: invalid number


SQL>

使用道具 举报

回复
论坛徽章:
64
会员2007贡献徽章
日期:2007-09-26 18:42:10NBA常规赛纪念章
日期:2008-04-18 19:48:16欧洲冠军杯纪念徽章
日期:2008-05-23 14:31:342009新春纪念徽章
日期:2009-01-04 14:52:28NBA常规赛纪念章
日期:2009-04-16 14:28:42NBA季后赛纪念徽章
日期:2009-06-16 11:28:172010新春纪念徽章
日期:2010-01-04 08:33:08
10#
 楼主| 发表于 2006-12-8 10:33 | 只看该作者
最初由 dba_mx 发布
[B][php]
SQL> select * from  (select to_number('a') from dual);
select * from  (select to_number('a') from dual)
                                 *
ERROR 位于第 1 行:
ORA-01722: 无效数字

可以看出:如果外层查询只想或许一个内层查询的记录数的话,那么内层的表达式是不被计算的,直接统计内层表的记录数;
反之,如果希望获取内容,则表达式必然要求值,此时才发现错误;

..
[/php]
Oracle的语义分析功能蛮强啊。。。。 [/B]


SQL> select count(*) from (select *  from (select TO_NUMBER(SUBSTR(PARTITION_NAME,6)) from user_tab_partitions)) ;

  COUNT(*)
----------
       920

SQL>

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表