Оператор проверки 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