Как извлечь поля с точным номером вхождения определенного символа / строки? - PullRequest
0 голосов
/ 09 июня 2019

Мне нужно извлечь строки, в которых символ (например, a) встречается ровно два раза в значении поля

Например.

X   

Khaan

Amal

Ryan13

Kamala

Вывод должен содержать только строки с точными двумя (последовательными или непоследовательными) вхождениями / A.

Таким образом, образец o / p должен быть

X   

Khaan

Amal

Я пытался

select * from mytable where regexp_like (X,'a{2}', 'i');

Но это дает только одну строку в o / p

X

Khaan

Ответы [ 3 ]

3 голосов
/ 09 июня 2019

В качестве альтернативы используйте REGEXP_COUNT:

SQL> with test (x) as
  2    (select 'Khaan'  from dual union all
  3     select 'Amal'   from dual union all
  4     select 'Ryan13' from dual union all
  5     select 'Kamala' from dual
  6    )
  7  select x
  8  from test
  9  where regexp_count(x, 'a', 1, 'i') = 2;

X
------
Khaan
Amal

SQL>
2 голосов
/ 09 июня 2019

Значение шаблона 'a{2}' состоит в том, что символ 'a' встречается 2 раза подряд.
Вы можете получить то, что вам нужно, с помощью этого утверждения:

select * from mytable
where length(X) - length(replace(lower(X),'a', '')) = 2

Он работает без учета регистра.
Он удаляет все вхождения a и вычитает длину оставшейся строки из длины исходной строки. Если результат равен 2, то строка возвращается.
См. Демоверсию .
Результаты:

> | X     |
> | :---- |
> | Khaan |
> | Amal  |

Edit.
Для такой строки, как 'abc', используйте это:

select * from mytable
where length(X) - length(replace(lower(X),'abc', '')) = 2 * length('abc')
1 голос
/ 09 июня 2019

Для этого вам не нужны регулярные выражения:

where lower(x) like '%a%a%' and
      lower(x) not like '%a%a%a%'

С регулярными выражениями один метод:

where regexp_like(x, '^[^aA]*[aA][^aA]*[aA][^aA]*$')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...