在字符串

时间:2016-12-19 16:34:32

标签: sql oracle

我需要一个select语句,在客户编号字段中显示任何无效字符。

一个虚拟客户编号以字母N开头,然后是10位,可以是0到9。

类似的东西,

SELECT (CustomerField, 'N[0-9](10)') <> '' 
FROM CustomerTable;

3 个答案:

答案 0 :(得分:3)

使用regexp_like

select customerfield
from CustomerTable
where not regexp_like(CustomerField, '^N[0-9]{10}$')

这将显示不遵循指定模式的客户区域。

答案 1 :(得分:1)

如果你真的需要在字符串中找到无效字符(而不仅仅是找到无效的字符串),这个更复杂的查询可能会有所帮助。你没有说明你可能需要输出的格式,所以我自己做了。我还创建了几个用于测试的字符串(特别是,检查NULL输入是否被正确处理总是很重要。)

len显示输入的长度(如果不是11)。空字符串(Oracle中为null)的长度显示为0. first-nondigit列引用从字符串中的SECOND位置开始的字符(忽略第一个字符,规则不同,并分别检查其有效性)。

with
     inputs ( str ) as (
       select 'N0123456789' from dual union all
       select ''            from dual union all
       select '02324434323' from dual union all
       select 'N02345678'   from dual union all
       select 'A2140480080' from dual union all
       select 'N93049c4995' from dual union all
       select 'N4448883333' from dual union all
       select 'PAR3993949Z' from dual union all
       select 'AN39E'       from dual
     )
-- end of test data; query begins below this line
select str,
       case when regexp_like(str, '^N\d{10}$') then 'valid'
            else 'invalid'                   end         as classif,
       case when length(str) != 11 then length(str)
            when str is null       then 0    end         as len,
       case when substr(str, 1, 1) != 'N' 
                      then substr(str, 1, 1) end         as first_char,
       regexp_substr(str, '[^0-9]', 2)                   as first_nondigit,
       nullif(regexp_instr( str, '[^0-9]', 2), 0)        as first_nondigit_pos
from   inputs
;

<强>输出

STR          CLASSIF    LEN  FIRST_CHAR FIRST_NONDIG FIRST_NONDIGIT_POS
-----------  -------  -----  ---------- ------------ ------------------
N0123456789  valid
             invalid      0
02324434323  invalid         0
N02345678    invalid      9
A2140480080  invalid         A
N93049c4995  invalid                    c                             7
N4448883333  valid
PAR3993949Z  invalid         P          A                             2
AN39E        invalid      5  A          N                             2

9 rows selected.

答案 2 :(得分:0)

\ d代表数字

Perl-influenced Extensions in Oracle Regular Expressions

其余如果可以在这里找到正则表达式元素

Regular Expression Operator Multilingual Enhancements

select  *
from    CustomerTable
where   not regexp_like (CustomerField,'^N\d{10}$')