MySQL REGEXP: соответствующие пустые записи - PullRequest
5 голосов
/ 18 июня 2010

У меня есть это условие SQL, которое должно извлекать все строки, которые удовлетворяют данному условию регулярного выражения:

country REGEXP ('^(USA|Italy|France)$')

Однако мне нужно добавить шаблон для извлечения всех пустых значений страны.В настоящее время я использую это условие

country REGEXP ('^(USA|Italy|France)$') OR country = ""

Как можно добиться того же эффекта без необходимости включать предложение ИЛИ?

Спасибо, Эрвин

Ответы [ 3 ]

5 голосов
/ 18 июня 2010

Это должно работать:

country REGEXP ('^(USA|Italy|France|)$')

Однако, с точки зрения производительности, вы можете использовать синтаксис IN

country IN ('USA','Italy','France', '')

Последнее должно быть быстрее, так как REGEXP может бытьдовольно медленно.

5 голосов
/ 18 июня 2010

Нет причины, по которой вы не можете использовать $ (соответствует концу строки), чтобы заполнить вопрос о "пустом подвыражении" ...

Это выглядит немного странно, но country REGEXP ('^(USA|Italy|France|$)$') на самом делеработа

2 голосов
/ 18 июня 2010

Вы можете попробовать:

country REGEXP ('^(USA|Italy|France|)$')

Я просто добавил еще | после France, что должно было бы сказать, что оно также соответствует ^$, что совпадает с country = ''.

Обновление: , поскольку этот метод не работает, я бы порекомендовал вам использовать это регулярное выражение:

country REGEXP ('^(USA|Italy|France)$|^$')

Обратите внимание, что вы не можете использовать регулярное выражение: ^(USA|Italy|France|.{0})$ потому что он будет жаловаться, что есть пустое подвыражение.Хотя ^(USA|Italy|France)$|^.{0}$ будет работать.

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

select '' regexp '^(USA|Italy|France)$|^$'
> 1
select 'abc' regexp '^(USA|Italy|France)$|^$'
> 0
select 'France' regexp '^(USA|Italy|France)$|^$'
> 1
select ' ' regexp '^(USA|Italy|France)$|^$'
> 0

Как видите, он возвращает именно то, что вы хотите.

Если вы хотите обрабатывать пустые значения одинаково (например, 0 пробелов и 5 пробелов, оба считаются пустыми), вы должны использовать регулярное выражение:

country REGEXP ('^(USA|Italy|France|\s*)$')

Это приведет к тому, что последняя строка в предыдущем примере будетведут себя по-разному, то есть:

select ' ' regexp '^(USA|Italy|France|\s*)$'
> 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...