REGEXP_LIKE для символа в любой позиции в пределах подстроки из 5 символов - PullRequest
0 голосов
/ 01 марта 2019

У меня есть старый запрос 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.Как я мог это сделать?

Ответы [ 4 ]

0 голосов
/ 02 марта 2019

пользователь запрашивает непрерывные 5 вхождений всех похожих символов, при этом один из них заменяет Y, а не просто N. Это одно из решений:

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})%');
0 голосов
/ 01 марта 2019

Как уже отмечалось, фрагмент кода, который вы разместили, на самом деле не сосредоточен на 5 символах, которые вы хотите исследовать.Я не могу сказать, было ли это потому, что оно было неправильно написано, или потому что код никогда не работал как задумано, или что-то еще.но, как написано, это говорит только о том, что где-то в строке есть Y, окруженный другими символами, так что в общей сложности не менее 5 символов.

WHY does this match NNNNN

будет соответствовать этому критерию, потому что 3-й символ вСтрока представляет собой Y, окруженный некоторыми другими символами, таким образом, сумма составляет не менее 5.

Если вы имеете в виду, что вы всегда смотрите на последний 5 символов - если блок tre изN s и Y s находятся в конце строки - тогда ваш исходный код будет работать, если он удалит завершающий % из каждого шаблона.

В этом случае может быть прощевозьмите последние 5 символов строки (с функцией подстроки, предоставляемой вашей текущей СУБД) и найдите любой Y в этой подстроке.В этом случае, если вы действительно хотите использовать регулярное выражение, вы просто хотите найти соответствие «Y» в любом месте подстроки, но это, вероятно, излишне.

В общем, это не кажется подходящим для регулярного выражения.раствор ИМО

0 голосов
/ 01 марта 2019

Попробуйте здесь WHAE CLAUSE:

where regexp_like(regexp_substr(bar,'[YN]{5}'),'Y')    

Пример ниже показывает, что он возвращает только те записи из таблицы "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.
0 голосов
/ 01 марта 2019

Разве вы не можете сделать что-то подобное?

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

Это в основном ваша логика и не требует регулярных выражений.

Если вы ищете специально для 5 символов, которыевсе Ns кроме 1Y, тогда я ожидал бы, что ваше like решение будет:

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

Простая версия регулярного выражения этого не очевидна для меня.

Один метод, который приходитclose это:

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 или более Ns, за которым следует Y, очень необычен в английских словах.

Конечно, есть и очевидное:

where regexp_like(bar, 'YNNNN|NYNNN|NNYNN|NNNYN|NNNNY')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...