1

我曾尝试在其他领域寻找,但我似乎无法弄清楚我正在做的事情有什么问题。我正在尝试在应该包含格式为“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.

有人对我有建议、问题或意见吗?

4

2 回答 2

6

您缺少与正则表达式相关的任何内容,这可能是它不起作用的原因。您的语法意味着您打算使用它们,在这种情况下我会同意这一点。正则表达式从 Oracle 10g 开始可用,因此您必须确保您使用的是此版本或更高版本。

语法将变为:

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

这表示:

  • ^- 固定到字符串的开头
  • [[:digit:]]- 只接受数值。这是 POSIX 兼容的变体,相当于\d.
  • {5}- 正好 5 次
  • -- 匹配连字符
  • $- 固定到字符串的末尾

要使连字符和第二个数字可选,您需要使用创建一个组()。这使得括号内的所有内容都成为一个单元,无论是字符串还是另一个正则表达式,然后您可以将其他运算符应用于它们。A?表示匹配 0 次或 1 次,需要应用于组。把它们放在一起,你会得到:

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

延伸阅读

阅读这个(第一次)有一个非常相似的问题,例如 3-1,它使用 Perl 类型的正则表达式语法\d而不是 POSIX 并且可能会引起兴趣。

于 2012-05-06T21:46:10.803 回答
0

LIKE运算符使用通配符 ( %and _) - http://docs.oracle.com/cd/F49540_01/DOC/server.815/a67779/operator.htm#997970

对于正则表达式,请尝试REGEXP_LIKE()函数 - http://www.regular-expressions.info/oracle.html

于 2012-05-06T21:45:06.450 回答