来自char sql的to_number

时间:2016-10-21 17:14:21

标签: sql oracle

我必须只选择只有偶数位的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;

3 个答案:

答案 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