#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\-''\.]'