Oracle SQL正则表达式匹配Varchar列-视为数字

Oracle SQL正则表达式匹配Varchar列-视为数字,sql,regex,oracle,Sql,Regex,Oracle,我有一个数据类型为VARCHAR2(7个字符)的列的表。此列中的数据具有100610072002等值 我想要一个匹配4002400340054014014013但不匹配4001的正则表达式 首先,我尝试使用To_number(columnName)>4001,但得到一个ORA-01722无效数字错误 然后,我尝试使用类似于的Regexp\u,但没有成功。我试过: 1. 40[02,03,05,11,13] 2. 40[0,1][^01] 3. 40[0,1]([2,3,5,11]) 任何

我有一个数据类型为VARCHAR2(7个字符)的列的表。此列中的数据具有100610072002等值

我想要一个匹配4002400340054014014013但不匹配4001的正则表达式

首先,我尝试使用
To_number(columnName)>4001
,但得到一个ORA-01722无效数字错误

然后,我尝试使用类似于的
Regexp\u,但没有成功。我试过:

 1. 40[02,03,05,11,13]
 2. 40[0,1][^01]
 3. 40[0,1]([2,3,5,11])
任何帮助都将不胜感激


干杯

您可以使用以下条件:

 col in ('4002','4003','4005','4011','4013')
如果您真的需要像
一样使用
regexp\u来执行此操作,那么有几种方法可以实现。以下是降低可读性和长度的几个顺序:

 regexp_like(col, '^(4002|4003|4005|4011|4013)$')
 regexp_like(col, '^40(02|03|05|11|13)$')
 regexp_like(col, '^40(0[235]|1[13])$')

请注意,正则表达式(
[…]
)中的类列出了要匹配的单个字符,而不是序列。

您可以使用以下条件:

 col in ('4002','4003','4005','4011','4013')
如果您真的需要像
一样使用
regexp\u来执行此操作,那么有几种方法可以实现。以下是降低可读性和长度的几个顺序:

 regexp_like(col, '^(4002|4003|4005|4011|4013)$')
 regexp_like(col, '^40(02|03|05|11|13)$')
 regexp_like(col, '^40(0[235]|1[13])$')


请注意,正则表达式(
[…]
)中的类列出了要匹配的单个字符,而不是序列。

如果您得到了ORA-01722,那么列中至少有一些值不是数字(或者可以转换为数字的字符串)。为什么列
编号不为
?您应该使用正确的数据类型。您已经给出了一些应该和不应该natch的值,但不是一般规则。您的尝试表明它必须以40开头,但是4020、4099或任何其他您没有显示的数字呢?为什么不在('4002'、'4003'、'4005'、'4011'、'4013')中只显示一个简单的
列呢?
?因此列声明为7个字符,但值都是四个字符?或者你在寻找一个可能是7个字符的字符串中的4002?嗨,谢谢你的回复。我只有对数据库的读取权限,所以我不能修改表等。你是对的,该列中的一些数据在末尾包含一个字母,我想这就是我得到oracle错误的原因@trincot-我试图消除我在where子句中列出的值,该子句包含其他AND子句,因此在这种情况下不会这样做。cheers@mathguy-我希望用正则表达式捕获的这些条目都是4个字符长的,不包含在其他字符串中。如果您获得了ORA-01722,则列中至少有一些值不是数字(或者可以转换为数字的字符串)。为什么列
编号不为
?您应该使用正确的数据类型。您已经给出了一些应该和不应该natch的值,但不是一般规则。您的尝试表明它必须以40开头,但是4020、4099或任何其他您没有显示的数字呢?为什么不在('4002'、'4003'、'4005'、'4011'、'4013')中只显示一个简单的
列呢?
?因此列声明为7个字符,但值都是四个字符?或者你在寻找一个可能是7个字符的字符串中的4002?嗨,谢谢你的回复。我只有对数据库的读取权限,所以我不能修改表等。你是对的,该列中的一些数据在末尾包含一个字母,我想这就是我得到oracle错误的原因@trincot-我试图消除我在where子句中列出的值,该子句包含其他AND子句,因此在这种情况下不会这样做。cheers@mathguy-我希望用正则表达式捕获的这些条目都是4个字符长的,并且不包含在其他stringsPerhaps中,甚至
(4002 | 4003 | 4005 | 4011 | 4013)
,以便于可读性和维护。您应该使用
^
$
锚定正则表达式。否则,它将匹配其他数字中间的数字。@ BARMAR - OP确认字符串是四位数字,尽管该列是VARCHAR2(7焦耳)。非常正确,@ Barmar,谢谢您强调了这一点。最好是安全的,不要假设字符串长度。@mathguy可能我误解了,但我认为他的意思是他匹配的数字都是4位数字,而不是所有的列内容。甚至可能是
(4002 | 4003 | 4005 | 4011 | 4013 | 4013 | 4011 | 4013)
,以便可读性和易于维护。您应该使用
^
$/code>锚定regexp。否则,它将匹配其他数字中间的数字。@ BARMAR - OP确认字符串是四位数字,尽管该列是VARCHAR2(7焦耳)。非常正确,@ Barmar,谢谢您强调了这一点。最好是安全的,不要假设字符串长度。@mathguy也许我误解了,但我认为他的意思是他匹配的数字都是4位数,而不是所有的列内容。