2014-01-26 62 views
0

我想創建一個Oracle SQL * Plus表,但我遇到了使用正則表達式的約束問題。使用sql約束排除某些字符(使用正則表達式)?

我想實現的約束是字段是4個字符,並且不能包含下列字符:!,£$ * <>「=

在現實中,我將足以僅僅只有允許字母數字字符,所以我嘗試了下面的正則表達式約束:

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

然而,當我試圖進入AAAA領域它說我違反了約束

我是一個完整的新對於Regexp來說,並且是SQL的一個相對新手,所以任何關於爲什麼它不能正常工作的解釋都將非常感謝!

回答

3

兩個選項:

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

(如果你想比串,其是小於或等於在長度爲4個字符以下則可通過{0,4}取代{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

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

請你能不能解釋一下,正則表達式做什麼? –

+0

'\ w'與'[[:alnum:] _]'相同,並且將允許字母數字字符AND下劃線([see here](http://docs.oracle.com/cd/B28359_01/appdev。 111/b28424/adfns_regexp.htm#CHDGHBHF))。如果你只是想要字母數字字符,那麼你需要使用'[[:alnum:]]或'[a-zA-Z0-9]'。 '{4}'表示前一次匹配重複總共4次,'^'和'$'是分別匹配字符串開始和結束的邊界匹配(但是如果您有一列是CHAR (4)'那麼這些邊界匹配是不必要的)。 – MT0