Найти строки, содержащие определенное число - PullRequest
0 голосов
/ 02 ноября 2019

Я хочу вернуть результаты из предложения SELECT WHERE , которое находит совпадения для точных чисел. Таким образом, если взять в качестве примера 9, я имею в виду число 9, а не 29, которое включает число 9.

Представьте следующие текстовые значения в таблице со столбцом varchar ...

  • образец 12-й
  • 9-й образец
  • 999
  • некоторый текст 9
  • 9a

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

Важно, чтобы запрос мог работать, если рядом с требуемым числом находятся другие символы, такие как буквы, а также символы. Используя 9 в качестве примера, просмотр 5 строк в списке выше означает, что пункты списка 2, 4 и 5 являются действительными.

Образец 3 недействителен - если бы я использовал предложение LIKE , образец 3, естественно, был бы возвращен, что мне не нужно.

Я думал, что LOCATE (9, COLUMN_NAME) может работать, но имеет ту же проблему, что и предложение LIKE.

Если это будет регулярное выражение, чтобы исправить это, может кто-нибудь подсказать, что это будет? У меня есть PHP-эквивалент:

/\d+/

... но я не уверен, как переписать его для MySQL.

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Вы можете использовать регулярное выражение, например:

SELECT *
FROM (
    SELECT 'a sample 12th' AS col UNION ALL
    SELECT '9th' UNION ALL
    SELECT '999' UNION ALL
    SELECT 'some text 9' UNION ALL
    SELECT '9a' UNION ALL
    SELECT 'foo9bar' UNION ALL
    SELECT 'foo99bar' 
) AS t
WHERE col REGEXP '([[:<:]]|[^[:digit:]])9([^[:digit:]]|[[:>:]])'

Регулярное выражение означает, что 9 окружено не цифрами или границей слова, поэтому, например, оно будет соответствовать foo9bar, но не foo99bar.

0 голосов
/ 02 ноября 2019

очень просто, используя 2 условия

select * from label where v like '%9%'and v not regexp '9[0-9]*9' ;

другой пример: если вы ищете 9 в каждой позиции, за которой не следует или не предшествует 9

select * from label where v regexp '^\(.*[^9]\)?9\([^9].*\)?$' ;

другой пример: выищите 9 на первой позиции

select * from label where v regexp '^9\([^9].*\)?$' ;

sqlfiddle, вдохновленный вопросами и комментариями

http://sqlfiddle.com/#!9/da68d6/1

ссылка на документацию https://dev.mysql.com/doc/refman/5.7/en/regexp.html#operator_regexp

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