Oracle支持正則表達式的函數

碰到一個需求:資料庫表EXT_ACCT_ITEM_TYPE有一個欄位ext_acct_item_code存放的數據是另外一張表的ID,而且是用逗號分隔開的。比如:ext_acct_item_code="1,3,4,5,6"。按設計要求,界面查詢的時候ext_acct_item_code這個欄位可以多選,也就是說:如果界面選擇了ID=2或者3,那麼要把EXT_ACCT_ITEM_TYPE這張表中所有ext_acct_item_code含有2或者3的數據都取出來。此時,用簡單的like已經無法解決了。因為2,3的順序不固定,且2,3不一定相鄰的存放,比如ext_acct_item_code的數據可能如下所示:

Advertisements

ext_acct_item_code="1,2,3,4,5"

ext_acct_item_code="1,3,2,4,5"

ext_acct_item_code="1,4,5,2,7,3"等等

此時用簡單的like根本無法解決,怎麼辦呢?此時,我們可以用regexp_like

1.EXT_ACCT_ITEM_TYPE表結構和原始數據

  • create table EXT_ACCT_ITEM_TYPE(

  • EXT_ACCT_ITEM_ID NUMBER(14) not null,

  • EXT_ACCT_ITEM_CODE VARCHAR2(30) not null,

  • EXT_ACCT_ITEM_NAME VARCHAR2(500) not null,

    Advertisements

  • EXT_TYPE NUMBER(1) not null

  • )

EXT_ACCT_ITEM_TYPE表數據

2.用regexp_like來實現查詢ext_acct_item_code欄位含有2或者3的數據

select t.*, rowid from EXT_ACCT_ITEM_TYPE t WHEREREGEXP_LIKE(','||t.ext_acct_item_code||',' ,'[,]2[,]|[,]3[,]');

使用REGEXP_LIKE查詢結果

就像上面所示,用REGEXP_LIKE就可以輕鬆實現你想要的效果了。

拓展延伸:

ORACLE中的支持正則表達式的函數主要有下面四個:

1.REGEXP_LIKE:與LIKE的功能相似,允許在SELECT,INSERT,UPDATE或DELETE語句的WHERE子句中執行正則表達式匹配

利用regexp_like查詢ext_acct_item_code以1開頭的數據

2.REGEXP_INSTR :與INSTR的功能相似,返回的是一個字元串在另外一個字元串中的位置

利用regexp_instr返回電話號碼所在的位置

3.REGEXP_SUBSTR :與SUBSTR的功能相似,返回的是匹配的字元串的子串

利用regexp_substr匹配的子串

4.REGEXP_REPLACE :與REPLACE的功能相似,將字元串中的子串替換成另外一個子串

利用regexp_replace將電話號碼替換成AA字元串

Advertisements

你可能會喜歡