我需要一个select语句,在客户编号字段中显示任何无效字符。
一个虚拟客户编号以字母N开头,然后是10位,可以是0到9。
类似的东西,
SELECT (CustomerField, 'N[0-9](10)') <> ''
FROM CustomerTable;
答案 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}$')