我试图在oracle sql中编写一个查询,以获取具有无效10位数字的行,即其中包含其他符号。
例如:
(111) 111-1111 #10 digit number with some symbols and spaces in between
111-111-1111
(111)111-1111
111)111-1111
(111) 11 1-1111
即它应该匹配10个非连续的数字,因为它中有一些符号。
所以它不应该与以下示例匹配:
111 #consecutive 3 digit number
11 1 #3 digit number with spaces
11-1 #3 digit number with symbol in between
1111111111 #consective 10 digit number
我正在使用REGEXP_LIKE,类似这样的
select * from table where REGEXP_LIKE(column, ?)
非常感谢任何帮助。感谢。
答案 0 :(得分:2)
您可以使用正则表达式和length
的组合;后者在没有其他字符的情况下排除纯10位数字:
regexp_like(col, '^[ .()-]*(\d[ .()-]*){10}$') and length(col) > 10
在[.()-]
课程中,您将列出您在数字中允许作为符号的所有字符。请注意,-
必须是该列表中的最后一个,否则将被转义。
如果您允许在10位数之间出现任何非数字,您可以使用\D
:
regexp_like(col, '^\D*(\d\D*){10}$') and length(col) > 10
答案 1 :(得分:1)
所以:字符串的长度应大于10,并且总的位数必须精确为10.这可以在没有正则表达式的情况下完成(这应该使它更快):
... where length(str) > 10 and
length(str) = 10 + length(translate(str, 'z0123456789', 'z'))
translate
会将字母z
翻译为自身,将所有其他字符(数字)翻译为空。必须包含z
是令人讨厌的,但不可避免;如果任何参数为NULL,translate
将返回NULL。第二个条件是输入str
的长度恰好比删除所有数字的字符串长度多10个 - 因此恰好有10个数字。