問題: 我要做的就是為我的正則運算式提供一個模式匹配字串,讓我可以選擇這種格式的加拿大郵政編碼:'A1A-2B2'(例如)。
我嘗試插入的資料型別:
Insert Into Table
(Table_Number, Person_Name, EMail_Address, Street_Address, City, Province, Postal_Code, Hire_Date)
Values
(87, 'Tommy', '[email protected]', '123 Street', 'location', 'ZY', 'T4X-1S2', To_Date('30-Aug-2020 08:50:56');
這是一個稍微修改/通用的版本,以保護一些資料。所有其他列都輸入得很好/沒有投訴。但是當我嘗試運行加載資料腳本時,它似乎不喜歡郵政編碼。
有問題的列和約束:
Postal_Code varchar2(7) Constraint Table_Postal_Code Null
Constraint CK_Postal_Code Check ((Regexp_like (Postal_Code, '^\[[:upper:]]{1}[[:digit:]]{1}[[:upper:]][[:punct:]]{1}[[:digit:]]{1}[[:upper:]](1}[[:digit:]]{1}$')),
我的邏輯:遵循正則運算式檔案:我有:
- 公開報價
- 指示字串開始的指數符號
- 反斜杠(我想解釋字串文字)-1 大寫字母,1 位數字,1 大寫字母,1 :punct: 解釋連字符,1 位數字,1 個大寫字母,1 位數字
- $ 表示字串的結尾
- 關閉報價
在我看來,這樣的事情應該可以作業,它說明了每個字母/字符以及它們必須在其中的范圍。但是關于我對這個模式匹配字串的格式設定有些問題。
我得到的錯誤是:
ORA-02290: check constraint (user.CK_POSTAL_CODE) violated
(再次稍微修改以保護我的身份)
這告訴我資料插入陳述句正在觸發我的檢查約束,僅此而已。所以它與約束本身的條件有關 - 即我用來匹配它的字串。我的導師告訴我插入資料是有效的,不需要任何修復,所以我很茫然。
限制/規則:連字符必須在那里/與我對問題的理解相匹配。它們在資料集中都是大寫的,所以我不必擔心這個例子的小寫。
我已經嘗試了這個 regexp 陳述句的無數變體,看看是否有什么能起作用,包括:
- 將所有這些鞋面更改為 :alpha: ,然后使用 'i' 暫時不檢查是否區分大小寫
- 洗掉 {1} 以防它是多余的
- 使用 - (反斜杠連字符) ,可能變成字串文字
- 僅使用連字符本身
- 甚至完全洗掉正則運算式并嘗試 LIKE [AZ][0-9][AZ]-[0-9][AZ][0-9] 等
- 保持鞋面,將 :digit:'s 轉到 [0-9] 看看這是否可行
我現在能想到的唯一合乎邏輯的事情是:檢查約束實際上作業正常,當它與我的語法匹配時就會跳閘。但我寫得不夠清楚,說“忽略這些情況,只有在不滿足這些條件時才會跳閘/激活”
但我束手無策,作為最后的手段在這里問。如果我最終能看到我的錯誤,我不會——但我能想到的一切,我可能都試過了。我確定它是一些我看不到的微小格式規則(我能感覺到)。感謝任何知道如何正確格式化這樣的模式匹配字串的人。
uj5u.com熱心網友回復:
看起來你可能有點過于復雜了正則運算式。下面的正則運算式根據您列出的第一組專案符號與您的描述相匹配:
REGEXP_LIKE (postal_code, '^[A-Z]\d[A-Z]-\d[A-Z]\d$')
uj5u.com熱心網友回復:
我看到那個正則運算式有兩個問題。
首先,你一\開始有一個虛假的。它對你沒有任何用處,擺脫它。
其次,倒數第二個{1}出現在您的代碼中,括號不匹配為(1}. 因為這個,我得到了錯誤ORA-12725: unmatched parentheses in regular expression。
老實說,你根本不需要{1}s:它們只是告訴正則運算式你想要前一項,這正是沒有它們你會得到的。
因此,您可以通過擺脫\和洗掉{1}s 來修復約束中的正則運算式,包括括號不匹配的那個。
下面是固定約束的演示:
SQL> CREATE TABLE postal_code_test (
2 Postal_Code varchar2(7) Constraint Table_Postal_Code Null
3 Constraint CK_Postal_Code Check ((Regexp_like (Postal_Code, '^[[:upper:]][[:digit:]][[:upper:]][[:punct:]][[:digit:]][[:upper:]][[:digit:]]$'))));
Table created.
SQL> INSERT INTO postal_code_test (postal_code) VALUES ('T4X-1S2');
1 row created.
SQL> INSERT INTO postal_code_test (postal_code) VALUES ('invalid');
INSERT INTO postal_code_test (postal_code) VALUES ('invalid')
*
ERROR at line 1:
ORA-02290: check constraint (user.CK_POSTAL_CODE) violated
uj5u.com熱心網友回復:
您不需要反斜杠,(1}而是使用{1}.
您可以將運算式簡化為:
Postal_Code varchar2(7)
Constraint Table_Postal_Code Null
Constraint CK_Postal_Code Check (
REGEXP_LIKE(Postal_Code, '^[A-Z]\d[A-Z][[:punct:]]\d[A-Z]\d$')
)
或者:
Constraint CK_Postal_Code Check (
REGEXP_LIKE(
Postal_Code,
'^[A-Z][0-9][A-Z][[:punct:]][0-9][A-Z][0-9]$'
)
)
或者:
Constraint CK_Postal_Code Check (
REGEXP_LIKE(
Postal_Code,
'^[[:upper:]][[:digit:]][[:upper:]][[:punct:]][[:digit:]][[:upper:]][[:digit:]]$'
)
)
或(盡管{1}這里的語法是多余的):
Constraint CK_Postal_Code Check (
REGEXP_LIKE(
Postal_Code,
'^[[:upper:]]{1}[[:digit:]]{1}[[:upper:]]{1}[[:punct:]]{1}[[:digit:]]{1}[[:upper:]]{1}[[:digit:]]{1}$'
)
)
小提琴
完全洗掉正則運算式并嘗試
LIKE [A-Z][0-9][A-Z]-[0-9][A-Z][0-9]等
這將不起作用,因為LIKE運算子與正則運算式模式不匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/508617.html
上一篇:OracleSQL嵌套子查詢
