關於字串匹配查詢的總結
判斷一個字元型欄位中出現某個字元超過3次的資料行,如果為了簡單達到目的,可以直接使用Like來做,
SQL> select content from clob_test where content like '%is%is%is%';
CONTENT
--------------------------------------------------------------------------------
this is a test,and it is very useful
但是可能在實際應用中,如果有一些有些特別的需求,比如判斷某個字串出現的次數20次以上的。用Like就有些體力活了。
如果欄位型別是clob,可以使用dbms_lob.instr來實現。
FUNCTION INSTR RETURNS NUMBER(38)
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
FILE_LOC BINARY FILE LOB IN
PATTERN RAW IN
OFFSET NUMBER(38) IN DEFAULT
NTH NUMBER(38) IN DEFAULT
下面來做一個簡單的測試。
SQL> create table clob_test(content clob);
Table created.
SQL> insert into clob_test values('this is a test,and it is very useful');
1 row created.
SQL> insert into clob_test values('here it is');
1 row created.
SQL> commit;
Commit complete.
從中查詢出現is超過3次的資料行。
SQL> select content from clob_test where dbms_lob.instr(content,'is',1,3)>0;
CONTENT
--------------------------------------------------------------------------------
this is a test,and it is very useful
如果是varchar2型別,貌似只能使用like了。其實不然。
如果在10g版本內,對於字串想自己寫一個類似的函式來處理,可以類似下面的形式。
SQL> select content from clob_test where (length(content)-length(replace(content,'is',null)))/(length('is'))>=3;
CONTENT
--------------------------------------------------------------------------------
this is a test,and it is very useful
如果在這個基礎上想更進一步,可以使用11g的regexp_count來實現。
SQL> select content from clob_test where regexp_count(content,'is')>=3;
CONTENT
--------------------------------------------------------------------------------
this is a test,and it is very useful
從上面的例子,可以看出這個函式有多實用,省去了很多其他的處理。
當然了在11g版本中,還有regexp_substr,regexp_instr,regexp_like等等的函式,也很實用。
加一個欄位,在varchar2上作這個測試。
SQL> alter table clob_test add(content2 varchar2(1000));
Table altered.
SQL> insert into clob_test(content2) values('stringtest=100#stringtest=50');
1 row created.
SQL> insert into clob_test(content2) values('stringtest=200#stringtest=60');
1 row created.
現在是想擷取 串"stringtest=100#stringtest=50"中間的100
如果按照一般的思路,可以這樣來做。
select
TO_NUMBER (
SUBSTR (
content2,
INSTR (content2,
'stringtest=')
+ 11,
INSTR (
SUBSTR (
content2,
INSTR (content2,
'stringtest=')
+ 11),
'#')
- 1))content3
from clob_test where content2 is not null;
CONTENT3
----------
100
200
如果使用regexp_substr來的話,可能一行就可以了。
SQL> select
2 to_number(replace(regexp_substr(content2,'[^stringtest=]+',1,1) ,'#','')) context3 from clob_test where content2 is not null;
CONTEXT3
----------
100
200
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1349358/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於MySQL 查詢表資料大小的總結MySql
- 關於查詢轉換的一些總結
- mysql字串之大小寫匹配查詢MySql字串
- 關於SQL Server資料查詢基本方法的總結SQLServer
- 關於查詢最佳化的一些總結
- Oracle:優化方法總結(關於連表查詢)Oracle優化
- 關於c語言輸入字串的總結C語言字串
- mysql 查詢,字串帶著空格也能匹配上MySql字串
- 關於join查詢的那麼點糾結
- 關於oracle使用者許可權查詢總結檢視Oracle
- 關於mysql查詢字符集不匹配問題的解決方法MySql
- MongoDB查詢總結MongoDB
- SQL查詢總結SQL
- [PY3]——字串的分割、匹配、搜尋方法總結字串
- 使用sed 命令查詢和替換檔案中的字串的方法總結字串
- 有關於三個表格結結合查詢的MYSQL語法MySql
- 關於樹結構的查詢優化,及許可權樹的查詢優化優化
- 關於分頁查詢結果的快取問題快取
- SQL“多欄位模糊匹配關鍵字查詢”SQL
- 關於oracle的空間查詢Oracle
- 關於動態字串的繫結字串
- 文字匹配相關方向打卡點總結
- 字串查詢演算法總結(暴力匹配、KMP 演算法、Boyer-Moore 演算法和 Sunday 演算法)字串演算法KMP
- 關於近期的總結
- 關於UIWebView的總結UIWebView
- 關於BeautifulSoup的總結
- 關於HTML的總結HTML
- 提高查詢速度方法總結
- SQL總結(一)基本查詢SQL
- SQL總結(三)其他查詢SQL
- 字串查詢(字串雜湊)字串
- 關於樹型結構資料遞迴查詢,轉非遞迴查詢的實現遞迴
- 關於innodb中查詢的定位方法
- 關於Hibernate的查詢問題
- 關於批次分頁查詢
- 關於查詢塊query blockBloC
- 關於字串的功能函式小結字串函式
- sqlserver關於always on的總結SQLServer