регулярные выражения внутри инструкции SQL IF

#mysql #regex #triggers

#mysql #регулярное выражение #триггеры

Вопрос:

Я знаю, что могу создавать базовые триггеры сравнения (см. Ниже)

 CREATE TRIGGER HospitalCheck
BEFORE INSERT ON Hospital
FOR EACH ROW
 BEGIN
  IF NEW.HospitalID > 9999 THEN
     call fail('HOSPITAL CODE INVALID');
  END IF;    
END
  

Как бы мне использовать регулярное выражение, которое допускает только числа? (вместо >9999)
(эквивалент SELECT string для проверки РЕГУЛЯРНОГО выражения ‘^[0-9] $’)

Я пытался:

 IF NEW.HospitalID REGEX '^[0-9] $' THEN 
  call fail('HOSPITAL CODE INVALID'); 
END IF;
  

Но я получаю

: ОШИБКА: —> #1064 — У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘REGEX’ ^[0-9] $’ ЗАТЕМ вызовите fail (‘НЕВЕРНЫЙ КОД БОЛЬНИЦЫ’); ЗАВЕРШИТЕ IF’ в строке 5

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

1. Да, но я получаю синтаксическую ошибку

2. IF NEW.HospitalID REGEX '^[0-9] $' THEN call fail('HOSPITAL CODE INVALID'); END IF; END : ОШИБКА: —> #1064 — У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘REGEX’ ^[0-9] $’ ЗАТЕМ вызовите fail (‘НЕВЕРНЫЙ КОД БОЛЬНИЦЫ’); ЗАВЕРШИТЕ IF’ в строке 5

3. Это регулярное выражение отметит его недействительным, если оно числовое. Либо замените РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ (должно быть REGEXP) на NOT_REGEXP, либо используйте ‘^[^0-9] $’

4. кстати, я надеюсь, вы не планируете использовать это в CHECK инструкции … xD

Ответ №1:

Функция NOT_REGEXP — смотрите документы http://dev.mysql.com/doc/refman/5.1/en/regexp.html

 IF colname NOT_REGEXP '^[0-9] $' THEN
  

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

1. Прошу прощения, если я был неясен, я спрашивал, как бы я заменил IF NEW. HospitalID > 9999 ЗАТЕМ <— из приведенного выше кода с эквивалентом РЕГУЛЯРНОГО выражения, который допускает только числа

2. Вот почему я указал вам на функцию. Вам было бы полезно реализовать функцию из документации, а не заставлять кого-то писать ее за вас 🙂

Ответ №2:

ЕСЛИ НЕТ РЕГУЛЯРНОГО выражения с именем столбца ‘^[0-9] $’, ТО

Ответ №3:

Просто измените регулярное выражение

 IF NEW.HospitalID REGEX '^[^0-9] $' THEN 
  call fail('HOSPITAL CODE INVALID'); 
END IF;
  

Объяснение

  1. Первый символ каретки обозначает начало идентификатора больницы.
  2. квадратная скобка [ обозначает начало символьного класса
  3. Второй символ каретки обозначает все символы, кроме от нуля до 9
  4. конечная квадратная скобка обозначает конец символьного класса
  5. символ со знаком плюс означает, что символов класса character должно быть один или несколько
  6. символ доллара обозначает конец переменной HospitalID.

Итак, вкратце, это регулярное выражение проверяет переменную HospitalID, и если оно обнаруживает, что переменная HospitalID содержит не числовые символы, оно вызывает функцию fail.