У меня есть таблица под названием licenses
, в которой хранятся номера профессиональных лицензий всех моих пользователей. Существует поле lic_type
, которое содержит официальный буквенный код профессиональной лицензии: «PN», «RN», «RT», «APRN», «EO» и так далее. В той же таблице лицензий есть еще один столбец, number
, который содержит числовую часть полной информации о лицензии, 2261234, 1234567 и так далее, но это поле не INT, а varchar(18) из-за необходимости некоторых строк (см. в этом вопросе). Я НЕ могу изменить структуру базы данных или тип столбца number
. В настоящее время, когда я объединяю эти два поля вместе, это должно дать полное обозначение лицензии.
Например, если lic_type — «RN», а номер — «2676612», то при их объединении получается правильная лицензия для физического лица — RN2676612. Однако полученная мной база данных содержит НЕКОТОРЫЕ записи в столбце number
, которые содержат полную лицензию, то есть RN2676612, а не просто цифры. Иногда буквы даже не являются правильным кодом. Например, lic-type
может быть «PN», но они могли ввести «LPN2261123», поэтому я не могу найти запись в lic_type
в столбце number
.
Мне нужен запрос MySQL, который вернет ЛЮБУЮ строку, где number
содержит любые буквы и хотя бы одно число. Я должен разрешить ввод полных букв в number
, таких как СТУДЕНТ или ОЖИДАНИЕ, но они всегда будут БЕЗ цифр, поэтому любая запись в number
, в которой есть буква и цифра, недействительна, и мне нужно исправить. Это позволяет мне обходить все буквенные номера при получении информации от полностью лицензированных клиентов.
В настоящее время я пробовал следующий запрос (в phpMyAdmin):
SELECT * FROM `licenses` WHERE `number` REGEXP '(?=.*\d) (?=.*[A-Z])[\d|\w]*'
который я позаимствовал из примера номерного знака.
Но возвращает ошибку:
#1139 - Got error 'repetition-operator operand invalid' from regexp.
Пожалуйста помоги!
Работал идеально. Я не являюсь опытным пользователем REGEX. Не могли бы вы объяснить свой ответ, чтобы я мог изменить его, если потребуется, позже для аналогичных проблем? Например, если мне нужно только поле, запись которого НАЧИНАЕТСЯ с букв, а не заканчивается.
Предоставьте данные, показывающие примеры каждого случая.
@Rick James - решение уже было дано и принято до того, как вы разместили свой комментарий.
Ты можешь использовать
WHERE `number` REGEXP "[[:alpha:]].*[0-9]|[0-9].*[[:alpha:]]"
Здесь,
[[:alpha:]].*[0-9]
- соответствует букве, затем любому нулю или более символов, а затем цифре|
- или (поскольку цифра может предшествовать букве)[0-9].*[[:alpha:]]
- соответствует цифре, затем любому нулю или более символов, а затем букве.
Вам понадобится
WHERE `number` REGEXP "[[:alpha:]].*[0-9]|[0-9].*[[:alpha:]]"