1、概述
本文介紹String類型及相關的函數,基於當前最新的Oracle 12c 為基礎作介紹。
下文將字符串簡稱為串。
Oracle函數的工作方式有兩種:
1、根據舊的對象創建新的對象——他們對原來的信息進行修改,如改變字母的大小寫。
2、告訴用戶有關的信息,如一個單詞或句子中有幾個字符。
后續會更新另外兩種處理文本的方式:Oracle中的正則表達式 和 Oracle Text工具,等文章編輯完成,會在此處添加鏈接。
Oracle中主要有兩種字符串類型:CHAR和VARCHAR2,他們以字母,標點,數字和空格的混合形式存在。
CHAR串始終為定長的,如果設置的值長度小於CHAR列的串值,會自動填充空格。在比較CHAR串時,會為雙方都補滿空格后再進行比較。
VARCHAR2數據類型為邊長的串(VARCHAR與VARCHAR2為同義詞)。
2、字符串處理函數
2.1、總覽
見下表:
2.2、連接符||及CONCAT函數
可以連接兩個列名或者常量。
比如:
1
|
|
- SELECT firstName||lastName FROM USER;
如果姓名為中文還好,但是如果是英文的,這樣連接會導致讀起來比較困難,所以可以在中間加上常量“空格”:
1
|
|
- SELECT firstName||' '||lastName FROM USER;
使用CONCAT函數也能達到同樣的效果:
1
|
|
- SELECT CONCAT(firstName,lastName) FROM USER;
結果:
但是CONCAT函數符合ANSI SQL標准,所以適合更多不同的數據庫,||是Oracle專有的,使用起來更簡潔。
2.3、格式統一:RPAD和LPAD
RPAD允許在列的右邊填充一組字符,填充的字符可以為任何字符。LPAD從左邊添加。
使用方式:
RPAD(string,length[,'set'])
LPAD(string,length[,'set'])
這里的string是數據庫中的字符串列或常量,length是填充后的長度,set是用來填充的字符串。如果方括號中的內容省略了,會默認使用空格填充。
RPAD的使用:
1
|
|
- SELECT rpad(lastname,10,'_') as name from users;
結果:
LPAD的使用:
1
|
|
- SELECT lpad(lastname,10) as name from users;
結果:
2.4、修剪:LTRIM,RTRIM,TRIM
LTRIM和RTRIM從串的左邊或右邊刪除不需要的字符。
使用方式:
RTRIM(string[,'set'])
LTRIM(string[,'set'])
如果沒有設置要刪除的值,默認刪除空格。
還是用例子來解釋,這里有一張存放書名的表,我們得到其書名列的值如下:
1
|
|
- SELECT name FROM BOOK;
這是因為錄入數據的不是同一個人,導致了數據格式不一致,首先我們來試一下LTRIM函數:
1
|
|
- SELECT LTRIM(name,'《') FROM BOOK;
可以看到左邊已經統一了,接下來就是右邊,我們很容易就能組合使用LTRIM和RTRIM:
1
|
|
- SELECT RTRIM(LTRIM(name,'《'),'》') FROM BOOK;
可以看到,查詢的結果已經統一了。可以一次刪除多個字符,只需要把要刪除的串設置進去即可。
我們在看一個例子,如果某個字段內容為:“the easy way”:
1
|
|
- INSERT INTO BOOK(ID,NAME) VALUES(6,'the easy way');
我們試着刪除前面的the和多余的空格,於是我們執行如下腳本:
1
|
|
- select ltrim(name,'the ') from book where id = 6;
結果:asy way
發現並不是我們想要的,以為LTRIM在刪除我們指定的字符串時,查找的不是這個字符串,而是里面的一個個字符,只有在第一次發現不屬於我們指定的字符串中的字符時才會退出。RTRIM和TRIM的原理也是一樣的。為了達到上面的目的,我們可以這樣做:
1
|
|
- select ltrim(ltrim(name,'the'),' ') from book where id = 6;
這樣就會輸出我們想要的結果。但是還有更為簡單的方式就是使用INSTR、SUBTR和DECODE函數,這在后面的文章中會介紹。
當我們兩邊要刪除的字符是相同的的時候,就可以使用TRIM函數,如果上例中,書名也可能是"think in java"(兩邊都是單引號)這樣的形式的話,如果想直接獲取單純的書名,就可以使用TRIM('"' from name):
1
|
|
- select trim('"' from name) from book where id=7;
注意TRIM中要刪除的只能是單個字符,形如TRIM('《》' from name)是錯誤的!
如果要從串的某一段刪除,可以使用LEADING和TRAILING字句,這時他們的作用於LTRIM和RTRIM是相同的:
1
|
|
- select trim(leading '"' from name) from book where id=7;
結果為:think in java"
2.5、大小寫轉換:LOWER、UPPER和INITCAP
LOWER把串或列種的任意字母轉換為小寫。
UPPER與LOWER相反。
INITCAP將串或列中每個單詞的首字母轉換成大寫。
它們經常一起使用。
使用格式:
LOWER(string)
UPPER(string)
INITCAP(string)
我們可以看一下例子就清楚了:
1
|
|
- select name,upper(name),lower(name),initcap(name) from book;
結果:
可以看到INITCAP不但將首字母大寫了,還將后面的字母轉換為小寫。
2.6、長度:LENGTH
使用LENGTH可以得到一個串的長度。
使用格式:
LENGTH(string)
例如:
1
|
|
- select name,length(name) from book;
結果:
2.7、子串:SUBSTR
使用SUBSTR函數可以提取出串的一部分。
使用格式:
SUBSTR(string,start[,count])
這個函數告訴Oracle提取string的一個子串,從start位置開始,長度為count個字符。如果不指定count,將從start開始一直到這個串結束。
如果有下面一張表:
1
|
|
- select * from phonebook;
如果我們需要不含區號的結果,可以這樣:
1
|
|
- select rpad(firstname||lastname,10,'.') as name,substr(phone,5) as phone from phonebook;
結果:
其中的start參數也可以是負值(僅當值類型為varchar2時,為char時不可用),這時就從串的末尾開始截取,比如上面的例子,也可以這樣:
1
|
|
- select rpad(firstname||lastname,10,'.') as name,substr(phone,-9) as phone from phonebook;
結果與前一個完全一致。
count參數值一旦指定就必須為正數,否則結果將返回null。
2.8、索引位置:INSTR
INSTR可以告訴你要搜索的字符(串)在串種的位置。
使用格式:
INSTR(string,set[,start[,occurrence]])
string為要尋找的列或常量;set為要指定的要尋找的值;start可選,默認為從串的第一個位置開始搜索;occurrence可選,為指定字符串出現的第occurrence次的位置。
我們依然來看看剛剛的例子:
1
|
|
- SELECT name FROM BOOK;
執行如下語句:
1
|
|
- select name,instr(name,'a') from book;
再帶上start參數:
1
|
|
- select name,instr(name,'a',7) from book;
繼續加上occurrence參數:
1
|
|
- select name,instr(name,'a',1,2) from book;
當然,我們也可以查找一個串:
1
|
|
- select name,instr(lower(name),'java') from book;
我們也經常會將INSTR函數與||、SUBSTR等函數一起使用,比如還是這個例子:
1
|
|
- select * from phonebook;
我們要將各個列查詢出來組合成一個串,其中,phone中的區號不一定就得是3位區號,有些地區就是4位,我們可以使用如下語句:
1
|
|
- select firstname||lastname||':'||substr(phone,instr(phone,'-')+1) as phoneinfo from phonebook;
2.9、轉碼:ASCII和CHR
他們不常用。
CHR吧數值轉換為等價的ASCII字符串;ASCII相反,但效果只對傳遞給他的值的第一個字符起作用。
一個例子:
1
|
|
- select 70,chr(70),'F',ascii('F'),ascii('FOCUS') from dual;
輸出:70FF7070
3、在ORDER BY和WHERE子句中使用串函數
串函數可以直接用於WHERE子句中:
1
|
|
- select name from book where length(name)>10;
或者是ORDER BY子句中:
1
|
|
- select name from book order by length(name);
我們也可以使用前面介紹的函數用於復雜的子句,比如稍微復雜一點的:
1
|
|
- select name from book where instr(name,'a',1,2)>0 and length(name)>10;
輸出:"think in java"
3.1、發音:SOUNDEX
SOUNDEX只用於WHERE子句的串函數。
他能查找在發音上類似於其他詞語的單詞,無需擔心這兩個單詞是如何拼寫的。
使用格式:SOUNDEX(string)
比如:
1
|
|
- select * from book where soundex(name) = soundex('java');
SOUNDEX還可以結合Oracle Text工具在文章總搜索單詞,這會在后面專門介紹Oracle Text的文章中介紹。
4、小結
本文主要介紹了Oracle中字符串相關函數的使用。
有些函數可以在顯示前調整內容:RPAD、LPAD、LTRIM、RTRIM、TRIM、LOWER、UPPER、INITCAP、SUBSTR等。
還有些函數告訴我們串的相關信息:LENGTH、INSTR、SOUNDEX等。
這些函數都可以單獨或者組合使用。
后續會更新兩篇非常相關的文章,到時會將鏈接添加到下面:
- Oracle中的正則表達式 Oracle Text工具