我曾尝试过寻找其他方面,但我似乎无法弄清楚我在做什么有什么问题。我试图在列上创建一个检查约束,该列应该包含格式为“00000-0000”的9位邮政编码。这是一个赋值,所以我唯一能做的就是创建一个检查约束。
我已经成功地将check语句用于其他列,但由于某种原因,我在Stack Overflow上找到的语句不起作用。唯一允许的字符是数字和连字符(' - ')。
alter table Student
add constraint student_zip_ck
check (Zip not like '%[0-9\-]%' escape '\');
由于此检查约束是在Stack Overflow上的另一个(正评级)问题之后建模的,所以我不知道可能出现什么问题。这是我收到的错误。
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.
有人对我有建议,问题或评论吗?
答案 0 :(得分:6)
你遗漏了与regular expressions相关的任何内容,这可能就是它无效的原因。你的语法意味着你打算使用它们,我会同意这种情况。自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})?$')
读这个(第一次)有一个相当类似的问题,example 3-1,它使用Perl类型的正则表达式语法\d
而不是POSIX,可能会引起关注。
答案 1 :(得分:0)
LIKE
运算符使用通配符(%
和_
) - http://docs.oracle.com/cd/F49540_01/DOC/server.815/a67779/operator.htm#997970
对于正则表达式,请尝试使用REGEXP_LIKE()
函数 - http://www.regular-expressions.info/oracle.html