Оператор проверки SQL для почтового индекса с использованием escape-символа

Я пытался искать в других областях, но я не могу понять, что не так с тем, что я делаю. Я пытаюсь создать проверочное ограничение для столбца, который должен содержать 9-значный почтовый индекс в формате "00000-0000". Это для назначения, поэтому единственное, что мне разрешено делать, это создать проверочное ограничение.

Я уже успешно использовал оператор проверки для других столбцов, но по какой-то причине оператор, который я нашел здесь при переполнении стека, не работает. Единственными допустимыми символами являются цифры и дефис ('-').

alter table Student
    add constraint student_zip_ck
    check (Zip not like '%[0-9\-]%' escape '\');

Поскольку это контрольное ограничение было смоделировано после другого (положительно оцененного) вопроса о переполнении стека, я не знаю, что может быть не так. Это ошибка, которую я получаю.

Error starting at line 751 in command:
alter table Student
  add constraint student_zip_ck
  check (Zip not like '%[0-9\-]%' escape '\')
Error report:
SQL Error: ORA-00604: error occurred at recursive SQL level 1
ORA-01424: missing or illegal character following the escape character
00604. 00000 -  "error occurred at recursive SQL level %s"
*Cause:    An error occurred while processing a recursive SQL statement
           (a statement applying to internal dictionary tables).
*Action:   If the situation described in the next error on the stack
           can be corrected, do so; otherwise contact Oracle Support.

У кого-нибудь есть предложения, вопросы или комментарии для меня?

2 ответа

Решение

Вам не хватает ничего, связанного с регулярными выражениями, поэтому, вероятно, это не работает. Ваш синтаксис подразумевает, что вы хотели их использовать, и я бы согласился с этим в этой ситуации. Регулярные выражения доступны с Oracle 10g, поэтому вы должны убедиться, что вы используете эту версию или выше.

Синтаксис станет:

alter table Student
    add constraint student_zip_ck
    check (regexp_like(Zip,'^[[:digit:]]{5}-[[:digit:]]{4}$'));

Это означает:

  • ^ - прикрепить к началу строки
  • [[:digit:]] - принимать только числовые значения. Это POSIX-совместимый вариант и эквивалентен \d,
  • {5} - ровно в 5 раз
  • - - сопоставить дефис
  • $ - прикрепить к концу строки

Чтобы сделать дефис и второй для цифр необязательным, необходимо создать группу, используя (), Это делает все в скобках единым целым, будь то строка или другое регулярное выражение, к которому затем можно применить другие операторы. ? означает совпадение 0 или 1 раз и должно быть применено к группе. Собрав все воедино, вы получите:

regexp_like(Zip,'^[[:digit:]]{5}(-[[:digit:]]{4})?$')

Дальнейшее чтение

Читая это (впервые), есть довольно похожая проблема, пример 3-1, которая использует синтаксис регулярного выражения типа Perl \d вместо POSIX и может представлять интерес.

LIKE оператор использует подстановочные знаки (% а также _) - http://docs.oracle.com/cd/F49540_01/DOC/server.815/a67779/operator.htm

для регулярных выражений попробуйте REGEXP_LIKE() функция - http://www.regular-expressions.info/oracle.html

Другие вопросы по тегам