首页 > 解决方案 > REGEXP_LIKE 用于 5 个字符的子字符串中任意位置的字符

问题描述

我有一个旧的 Access 查询,我正在尝试将其转换为 Oracle SQL。它的一部分查看可以包含一大堆文本的字符串,而字符串的另一部分是一系列五个字符,例如:

NNNNN

我想要做的是找到这些字符中的任何一个,Y但只有在特定格式中,在 5 个字符内。例如,整个字符串可能是:

The quick brown fox jumps over the lazy dog NNNNN

我不想退货,因为这五个NNNNN不包含Y.

当前查询执行以下操作:

SELECT *
FROM foo
WHERE
(
bar LIKE '%Y____%' OR 
bar LIKE '%_Y___%' OR
bar LIKE '%__Y__%' OR 
bar LIKE '%___Y_%' OR
bar LIKE '%____Y%'
)

但是,我认为这可以通过单个 REGEXP_LIKE 语句更好地实现。我怎么能这样做?

标签: sqloracleregexp-like

解决方案


你不能做这样的事情吗?

where bar like '%Y%' and length(b) >= 5

这基本上是您的逻辑,不需要正则表达式。

如果您正在寻找 5 个字符,除了 1Y 之外都是 N,那么我希望您的like解决方案是:

where bar like '%YNNNN%' or bar like '%NYNNN%' or . . . 

一个简单的正则表达式版本对我来说并不明显。

一种接近的方法是:

where regexp_like(bar, '[YN]{5}') and    -- has a substring with 5 characters, all of which are Y and N
      not regexp_like(bar, 'Y[N]{0-3}Y'  -- has no substring with Y followed by 0-3 Ns and another Y

这可能会在其他文本中的某些单词上失败。但是,Y 后跟 0 个或多个 N 后跟 Y 在英语单词中是非常不寻常的。

当然,也有明显的:

where regexp_like(bar, 'YNNNN|NYNNN|NNYNN|NNNYN|NNNNY')

推荐阅读