Выберите номера пар в запросе SQL - PullRequest
0 голосов
/ 06 июля 2019

База данных:

+------------+
|   Number   |
+------------+
| 0050000235 |
+------------+
| 5532003644 |
+------------+
| 1122330505 |
+------------+
| 1103220311 |
+------------+
| 1103000011 |
+------------+
| 1103020012 |
+------------+

Чтобы выбрать числа, имеющие пару "0", 3 раза я пытался:

SELECT * FROM numbers
WHERE Number LIKE "%00%00%00%"
    OR Number LIKE "%00%0000%"
    OR Number LIKE "%0000%00%"
    OR Number LIKE "0000%00%"
    OR Number LIKE "%00%0000"   
    OR Number LIKE "00%0000%"
    OR Number LIKE "%0000%00"
    OR Number LIKE "%0000%00"
    OR Number LIKE "%000000%" 
    OR Number LIKE "000000%"
    OR Number LIKE "%000000" 

Это приводит меня:

0050000235

Но способ, которым я пользуюсь, я думаю, это не чистый метод.

Вопрос Как получить числа , содержащие 3 пары , с чистым SQL-запросом?

Результат будет:

0050000235, 5532003644, 1122330505, 1103220311 и 1103000011

Ответы [ 3 ]

1 голос
/ 06 июля 2019

Создайте серию чисел от 0 до 9 с помощью UNION ALL и перекрестное соединение с таблицей.Каждое из этих чисел будет удвоено и заменено в столбце таблицы пустой строкой.Разница в длине каждой замены будет суммироваться, и если она больше 6, это означает, что существует как минимум 3 пары:

select 
  n.number
from (
  select 0 d union all select 1 d union all select 2  union all 
  select 3 union all select 4 union all select 5 union all 
  select 6 union all select 7 union all select 8 union all select 9
) s cross join numbers n
group by n.number                     
having sum(
  length(n.number) - length(replace(n.number, repeat(d, 2), '')) 
) >= 6 

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

| number     |
| ---------- |
| 0050000235 |
| 1103000011 |
| 1103220311 |
| 1122330505 |
| 5532003644 |
1 голос
/ 06 июля 2019
where Number rlike '((00|11|22|33|44|55|66|77|88|99).*){3}'
0 голосов
/ 06 июля 2019

Как насчет использования регулярных выражений?

where number regexp '00.*00.*00'

Или немного короче:

where number regexp '(00.*){3}'

Вы можете легко обобщить это на любые два числа:

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

Если вы хотите обеспечить ровно шесть '0' (в отличие от большего):

where number regexp '^[^0]*00[^0]*00[^0]*00[^0]*$'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...