从 sql 查询条件转换为 REGEXP_LIKE

时间:2021-01-05 10:47:49

标签: sql regex oracle

我正在转换一个 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 所以 _ 是数字字符

1 个答案:

答案 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) 匹配 1051