MySQL: как проверить, содержит ли строка какой-либо символ из набора?

#mysql #sql #string

Вопрос:

У меня есть этот набор недопустимых символов: 0-9!<>,;?= ()@#"°{}_$%/^*

Мне нужно выяснить, есть ли у клиентов firstname или lastname содержит ли кто-либо из них.

До сих пор я использую:

 SELECT id_customer, firstname, lastname FROM customer WHERE (
    firstname REGEXP '[0-9]' OR lastname REGEXP '[0-9]' OR
    firstname LIKE '%.%' OR lastname LIKE '%.%' OR
    firstname LIKE '%@%' OR lastname LIKE '%@%'
)
 

Есть ли более чистый подход к этому без повторения LIKE ?

Комментарии:

1. WHERE CONCAT(firstname, lastname) REGEXP '[0-9!<>,;?= ()@#"°{}_$%/\^*]'

Ответ №1:

Это должно сделать это:

 WHERE firstname REGEXP '[0-9\!\<\>,;\?\=\ \(\)@\#"\{\}_\$%/\\\^\*]'
OR    lastname  REGEXP '[0-9\!\<\>,;\?\=\ \(\)@\#"\{\}_\$%/\\\^\*]'
 

Но я бы предпочел создать список допустимых символов (они конечны и счетны). Этот набор можно инвертировать с помощью ^ ; остальная логика остается прежней:

 -- names must only consist of a-z, hyphen, apostrophe and and dots
WHERE firstname REGEXP '[^a-z\-''\.]'
OR    lastname  REGEXP '[^a-z\-''\.]'