使用sql约束(使用regexp)排除某些字符?

时间:2014-01-26 17:06:32

标签: sql regex oracle sqlplus

我正在尝试创建一个Oracle SQL * Plus表,但我在使用正则表达式的约束时遇到问题。

我想要实现的约束是该字段长度为4个字符,不能包含以下字符:,。!£$ *<>“=

实际上我只够允许使用字母数字字符,所以我尝试了以下正则表达式约束:

            CONSTRAINT CHK_Foo CHECK (Foo LIKE '[[:alnum:]]'), 

然而,当我试图输入AAAA字段时,它说我违反了约束条件。

我是Regexp的全新人,也是SQL的新手,所以任何关于它为什么不起作用的解释都会非常感激!

3 个答案:

答案 0 :(得分:3)

两个选项:

  1. CHECK (REGEXP_LIKE( foo, '[^,.!£$*<>"=]{4}' ) )将接受所有不包含,.!£$*<>"=
  2. 的4个字符的字符串
  3. CHECK (REGEXP_LIKE( bar, '[a-zA-Z0-9]{4}' ) )将接受仅包含a-zA-Z0-9
  4. 的所有4个字符的字符串

    (如果您希望少于长度小于或等于4个字符的字符串,则可以将{4}替换为{0,4}

    SQL Fiddle

    Oracle 11g R2架构设置

    CREATE TABLE test (
      foo CHAR(4) NOT NULL,
      bar CHAR(4) NOT NULL,
      CONSTRAINT chk_foo CHECK (REGEXP_LIKE( foo, '[^,.!£$*<>"=]{4}' ) ),
      CONSTRAINT chk_bar CHECK (REGEXP_LIKE( bar, '[a-zA-Z0-9]{4}' ) )
    );
    

    查询1

    INSERT INTO test VALUES ( 'AAAA', '"AAA' );
    

    结果1

    ORA-02290: check constraint (USER_4_850C2.CHK_BAR) violated : INSERT INTO test VALUES ( 'AAAA', '"AAA' )
    

    查询2

    INSERT INTO test VALUES ( '$AAA', 'AAAA' );
    

    结果2

    ORA-02290: check constraint (USER_4_850C2.CHK_FOO) violated : INSERT INTO test VALUES ( '$AAA', 'AAAA' )
    

    查询3

    INSERT INTO test VALUES ( 'AAAA', 'AAAA' )
    

    结果3

答案 1 :(得分:2)

CONSTRAINT CHK_Foo CHECK (regexp_LIKE(Foo, '^\w{4}$'))

答案 2 :(得分:0)

你应该构建一个正确的Oracle regexp,然后使用REGEXP_LIKE而不仅仅是LIKE。

见这里:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm

http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#CHDIDJJC