我正在转换一个 SQL 查询条件,例如:
where req_number like '169___[3,4,5,6]10%' OR req_number like '169___[3,4,5,6]51%'
我尝试使用条件 belove 在 Oracle 中执行查询,但没有返回结果:
where (REGEXP_LIKE (req_number, '169___[3456]10$') OR REGEXP_LIKE (req_number, '169___[3456]51$'))
结果看起来像 169011310
所以 _ 是数字字符
答案 0 :(得分:1)
正则表达式中的 $
表示字符串结束,您需要将其删除,因为 TSQL 中的 %
表示任何文本、任何零或更多字符,并且 REGEXP_LIKE
不需要完整的字符串匹配。
由于 _
在 TSQL 中表示任何单个字符,您可以将每个 _
替换为正则表达式中的 .
。
169
必须匹配在字符串的开头,因为 TSQL like
模式必须始终匹配整个记录,因此您需要在正则表达式的开头添加 ^
。< /p>
你可以使用
where (REGEXP_LIKE (req_number, '^169.{3}[3456]10') OR REGEXP_LIKE (req_number, '^169.{3}[3456]51'))
您可以将 .{3}
写为 ...
,但是,稍后使用限制量词 {n}
(n
次< /em>).
此外,您可以将 [3456]
更改为 [3-6]
,因为此处的数字是连续的。
进一步优化它,因为表达式只在最后一个数字上不同,你可以使用交替:
where REGEXP_LIKE (req_number, '^169.{3}[3-6](10|51)')
其中 (10|51)
匹配 10
或 51
。