REGEXP_LIKE 对于 5 个字符的子串中任意位置的字符
REGEXP_LIKE for character at any position within substring of 5 characters
我有一个旧的 Access 查询,我正试图将其转换为 Oracle SQL。它的一部分查看一个字符串,该字符串可以包含一大堆文本,而该字符串的另一部分是一系列五个字符,例如:
NNNNN
我想做的是找到这些字符中的任何一个 Y
,但仅限于 5 个字符以内的特定格式。例如,整个字符串可能是:
The quick brown fox jumps over the lazy dog NNNNN
我不想return这个因为五个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 语句可以更好地实现这一点。我该怎么做?
你不能做这样的事情吗?
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')
如其他地方所述,您发布的代码片段实际上并未将您要检查的 5 个字符归零。那是因为它被错误地转录,还是因为代码从未按预期工作,或者其他原因,我不能说。但正如所写的那样,它只说字符串中某处是一个 Y,周围是其他字符,因此总共至少有 5 个字符。
WHY does this match NNNNN
会满足该条件,因为字符串中的第 3 个字符是 Y,周围有一些其他字符,因此总数至少为 5。
如果您的意思是您总是查看 last 5 个字符 - 如果 N
s 和 Y
s 的 tre 块位于字符串的末尾 - 如果从每个模式中删除尾随 %
,那么您的原始代码将起作用。
在这种情况下,获取字符串的最后 5 个字符(使用当前 DBMS 提供的子字符串函数)并在该子字符串中查找任何 Y
可能更容易。在那种情况下,如果您真的想使用正则表达式,您只需要在子字符串中的任何地方匹配 "Y",但这可能有点矫枉过正。
总的来说,这似乎不太适合 IMO 的正则表达式解决方案
试试这个 WHERE 子句:
where regexp_like(regexp_substr(bar,'[YN]{5}'),'Y')
下面的示例显示它 returns 只有来自 table "foo" 的那些记录,其中 (Ys 或 Ns) 的字符串包含 "Y"。
select * from foo;
BAR
--------------------------------------------------
The quick brown fox jumps over the lazy dog YNNNN
The quick brown fox jumps over the lazy dog NYNNN
The quick brown fox jumps over the lazy dog NNYNN
The quick brown fox jumps over the lazy dog NNNYN
The quick brown fox jumps over the lazy dog NNNNY
The quick brown fox jumps over the lazy dog NNNNN
The quick brown fox jumps over the lazy dog NNNNN
The quick brown fox jumps over the lazy dog NNNNN
The quick brown fox jumps over the lazy dog NNNNN
The quick brown fox jumps over the lazy dog NNNNN
10 rows selected.
select * from foo where regexp_like(regexp_substr(bar,'[YN]{5}'),'Y');
BAR
--------------------------------------------------
The quick brown fox jumps over the lazy dog YNNNN
The quick brown fox jumps over the lazy dog NYNNN
The quick brown fox jumps over the lazy dog NNYNN
The quick brown fox jumps over the lazy dog NNNYN
The quick brown fox jumps over the lazy dog NNNNY
5 rows selected.
用户要求所有相似字符连续出现 5 次,其中一个替换 Y 而不仅仅是 N.This 是解决方案之一:
select * from foo where
regexp_like(bar,'%Y(A{4}|B{4}|C(4)....Z{4}%)') or
regexp_like(bar,'%(A{4}|B{4}|C(4)....Z{4})Y%') or
regexp_like(bar,'%(A{1}|B{1}|C(1)....Z{1})Y(A{3}|B{3}|C{3)....Z{3})%') or
regexp_like(bar,'%(A{2}|B{2}|C(2)....Z{2})Y(A{2}|B{2}|C{2}....Z{2})%') or
regexp_like(bar,'%(A{3}|B{3}|C(3)....Z{3})Y(A{1}|B{1}|C{1}....Z{1})%');
我有一个旧的 Access 查询,我正试图将其转换为 Oracle SQL。它的一部分查看一个字符串,该字符串可以包含一大堆文本,而该字符串的另一部分是一系列五个字符,例如:
NNNNN
我想做的是找到这些字符中的任何一个 Y
,但仅限于 5 个字符以内的特定格式。例如,整个字符串可能是:
The quick brown fox jumps over the lazy dog NNNNN
我不想return这个因为五个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 语句可以更好地实现这一点。我该怎么做?
你不能做这样的事情吗?
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')
如其他地方所述,您发布的代码片段实际上并未将您要检查的 5 个字符归零。那是因为它被错误地转录,还是因为代码从未按预期工作,或者其他原因,我不能说。但正如所写的那样,它只说字符串中某处是一个 Y,周围是其他字符,因此总共至少有 5 个字符。
WHY does this match NNNNN
会满足该条件,因为字符串中的第 3 个字符是 Y,周围有一些其他字符,因此总数至少为 5。
如果您的意思是您总是查看 last 5 个字符 - 如果 N
s 和 Y
s 的 tre 块位于字符串的末尾 - 如果从每个模式中删除尾随 %
,那么您的原始代码将起作用。
在这种情况下,获取字符串的最后 5 个字符(使用当前 DBMS 提供的子字符串函数)并在该子字符串中查找任何 Y
可能更容易。在那种情况下,如果您真的想使用正则表达式,您只需要在子字符串中的任何地方匹配 "Y",但这可能有点矫枉过正。
总的来说,这似乎不太适合 IMO 的正则表达式解决方案
试试这个 WHERE 子句:
where regexp_like(regexp_substr(bar,'[YN]{5}'),'Y')
下面的示例显示它 returns 只有来自 table "foo" 的那些记录,其中 (Ys 或 Ns) 的字符串包含 "Y"。
select * from foo;
BAR
--------------------------------------------------
The quick brown fox jumps over the lazy dog YNNNN
The quick brown fox jumps over the lazy dog NYNNN
The quick brown fox jumps over the lazy dog NNYNN
The quick brown fox jumps over the lazy dog NNNYN
The quick brown fox jumps over the lazy dog NNNNY
The quick brown fox jumps over the lazy dog NNNNN
The quick brown fox jumps over the lazy dog NNNNN
The quick brown fox jumps over the lazy dog NNNNN
The quick brown fox jumps over the lazy dog NNNNN
The quick brown fox jumps over the lazy dog NNNNN
10 rows selected.
select * from foo where regexp_like(regexp_substr(bar,'[YN]{5}'),'Y');
BAR
--------------------------------------------------
The quick brown fox jumps over the lazy dog YNNNN
The quick brown fox jumps over the lazy dog NYNNN
The quick brown fox jumps over the lazy dog NNYNN
The quick brown fox jumps over the lazy dog NNNYN
The quick brown fox jumps over the lazy dog NNNNY
5 rows selected.
用户要求所有相似字符连续出现 5 次,其中一个替换 Y 而不仅仅是 N.This 是解决方案之一:
select * from foo where
regexp_like(bar,'%Y(A{4}|B{4}|C(4)....Z{4}%)') or
regexp_like(bar,'%(A{4}|B{4}|C(4)....Z{4})Y%') or
regexp_like(bar,'%(A{1}|B{1}|C(1)....Z{1})Y(A{3}|B{3}|C{3)....Z{3})%') or
regexp_like(bar,'%(A{2}|B{2}|C(2)....Z{2})Y(A{2}|B{2}|C{2}....Z{2})%') or
regexp_like(bar,'%(A{3}|B{3}|C(3)....Z{3})Y(A{1}|B{1}|C{1}....Z{1})%');