Использование Regex в запросе SQL - PullRequest
1 голос
/ 07 июля 2019
create table numbers (number varchar(10));
insert into numbers (number) values
('9999999999'),
('5532003644'), 
('1212121205'),                                      
('1103220311'),                                     
('1121212128'),
('1234123425');                                    

Попытка ВЫБРАТЬ только серии XY-XY-XY из базы данных:

SELECT * FROM numbers
where number regexp '(.*([0-9])\2.*){3}'

Дайте мне результаты:

1212121205, 1121212128 и 1234123425


Как 1234123425 это серии XY-XY-XY?

DB-FIDDLE

Ответы [ 3 ]

3 голосов
/ 07 июля 2019

Все ваши вопросы интересные головоломки sql.
Это решение также не включает регулярные выражения:

select distinct n.number
from (
  select 1 start union all select 2  union all select 3 union all 
  select 4 union all select 5 
) s cross join numbers n
where 
  left(substring(n.number, s.start, 2), 1) <> right(substring(n.number, s.start, 2), 1)
  and
  n.number like concat(
    '%', substring(n.number, s.start, 2), 
    substring(n.number, s.start, 2),
    '%', substring(n.number, s.start, 2), '%'
  )

См. Демоверсию .
Результаты:

| number     |
| ---------- |
| 1212121205 |
| 1121212128 |
1 голос
/ 07 июля 2019

Частично проблема в том, что вы не избежите обратной косой черты. Обратная косая черта - это как экранирование строки, так и экранирование регулярного выражения; чтобы получить его в движке регулярных выражений, вам нужно его убрать для парсера строк. В противном случае \2 рассматривается как просто 2, поэтому ([0-9])\2 соответствует любой цифре, следующей за 2.

Но вам не нужно использовать обратную ссылку. \2 будет соответствовать любому ([0-9]), что сделает ваш код похожим на XX, а не на XY. Я не думаю, что есть способ написать регулярное выражение, в котором вы соответствуете любому символу , отличному , кроме обратной ссылки.

0 голосов
/ 07 июля 2019

Это не совсем ответ, но вы можете сделать это с помощью регулярных выражений.Проблема в том, что MySQL не поддерживает обратные ссылки.Postgres, делает, поэтому следующее делает то, что вы намереваетесь:

SELECT *
FROM numbers
WHERE number ~ '([0-9]{2}).*(\1).*(\1)'

Здесь - это dbfiddle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...