在内部查询结果中应用ORACLE中的Casted数字coulmn的条件

时间:2016-12-14 13:54:50

标签: oracle

对于Sample,我们创建一个包含以下模式的表并填充一些示例值

CREATE TABLE games(ID INT ,Name VARCHAR(20));
INSERT INTO games(ID,Name) VALUES (2008,'Beijing');
INSERT INTO games(ID,Name) VALUES (2012,'London');
INSERT INTO games(ID,Name) VALUES (2012,12);
INSERT INTO games(ID,Name) VALUES (2012,654);

输出:

ID      NAME
2008    Beijing
2012    London
2012    12
2012    654

在上表中,我们在名称列中同时包含数字和字符串数据,允许编写使用REGX仅过滤数字行的查询

SELECT TO_NUMBER(Name)as Trimmed FROM games where REGEXP_LIKE(Name, '(?<=\s|^)\d+(?=\s|$)', '')

输出:

TRIMMED
12
654

现在问题是如果从上面的结果中写出一个大于12的值的where子句,它会抛出无效的数字

Select * from (SELECT TO_NUMBER(Name)as Trimmed FROM games where REGEXP_LIKE(Name, '(?<=\s|^)\d+(?=\s|$)', '')) T1 where T1.Trimmed >12 ;

我发现这是oracle查询规划的工作方式,但是还有其他方法可以实现这个

2 个答案:

答案 0 :(得分:0)

这将有效:

Select * from 
  (SELECT Name as Trimmed 
    FROM games where REGEXP_LIKE(Name, '(?<=\s|^)\d+(?=\s|$)', '')) T1 
where to_number(T1.Trimmed) >12 ;

不幸的是你需要一个子查询。一个人无法完成。

答案 1 :(得分:0)

这可以在一个查询中完成:

with
     inputs as (
       select 2008 as id, 'Beijing' as name from dual union all
       select 2012      , 'London'          from dual union all
       select 2012      , '12'              from dual union all
       select 2012      , '654'             from dual
     )
select id, name
from   inputs
where  translate(name, 'a0123456789', 'a') is null
  and  to_number(regexp_replace(name, '[^[:digit:]]', '')) > 12
;


        ID NAME
---------- -------
      2012 654

1 row selected.

regexp_replace删除除数字之外的所有字符,因此无论名称是什么,都可以进行测试。如果名称中没有数字,则结果为NULL,可以转换为数字(它仍为空)。

用于测试&#34;全数字&#34;的translate解决方案比使用regexp_like更有效。由于'a'函数本身存在奇怪现象,因此需要translate中的奇怪translate(请参阅文档)。如果所有名称都是&#34;所有字母&#34;或&#34;所有数字&#34; (如果&#34;所有字母&#34;,使用regexp_replace的第二次测试就足够了);但是,如果像#2000; Sydney 2000&#34;可以在name列中找到。