我必须只选择只有偶数位的ID(ID如下:p19,p20等)。也就是说,p20是好的(2和0都是偶数); p18不是。
我想使用substr从ID中获取每个数字,然后查看它是否均匀。
select from profs
where to_number(substr(id_prof,2,2))%2=0 and to_number(substr(id_prof,3,2))%2=0;
答案 0 :(得分:5)
如果您需要所有行在开头包含'p',在偶数上包含偶数数字它应该如下所示:
select *
from profs
where regexp_like (id_prof, '^p[24680]+$');
答案 1 :(得分:2)
with
profs ( prof_id ) as (
select 'p18' from dual union all
select 'p24' from dual union all
select 'p53' from dual
)
-- End of test data; what is above this line is NOT part of the solution.
-- The solution (SQL query) begins here.
select *
from profs
where length(prof_id) = length(translate(prof_id, '013579', '0'));
PROF_ID
-------
p24
此解决方案应该比使用正则表达式的任何方法都更快。它所做的只是将0替换为自身并删除输入字符串中的所有奇数。 (' 0'由于translate()
的奇怪但有记录的行为而被包括在内 - 第三个参数不能为空。如果输入字符串的长度在转换后没有改变,则表示输入字符串没有任何奇数位。
答案 2 :(得分:0)
where mod(to_number(regexp_replace(id_prof, '[^[:digit:]]', '')),2) = 0