使用转义字符的邮政编码的SQL检查声明

时间:2012-05-06 21:33:39

标签: sql oracle escaping check-constraints

我曾尝试过寻找其他方面,但我似乎无法弄清楚我在做什么有什么问题。我试图在列上创建一个检查约束,该列应该包含格式为“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.

有人对我有建议,问题或评论吗?

2 个答案:

答案 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