对于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查询规划的工作方式,但是还有其他方法可以实现这个
答案 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
列中找到。