Oracle中的字符串類型及相關函數詳解


1、概述

本文介紹String類型及相關的函數,基於當前最新的Oracle 12c 為基礎作介紹。

下文將字符串簡稱為串。

Oracle函數的工作方式有兩種:

1、根據舊的對象創建新的對象——他們對原來的信息進行修改,如改變字母的大小寫。

2、告訴用戶有關的信息,如一個單詞或句子中有幾個字符。

后續會更新另外兩種處理文本的方式:Oracle中的正則表達式 和 Oracle Text工具,等文章編輯完成,會在此處添加鏈接。

Oracle中主要有兩種字符串類型:CHAR和VARCHAR2,他們以字母,標點,數字和空格的混合形式存在。

CHAR串始終為定長的,如果設置的值長度小於CHAR列的串值,會自動填充空格。在比較CHAR串時,會為雙方都補滿空格后再進行比較。

VARCHAR2數據類型為邊長的串(VARCHAR與VARCHAR2為同義詞)。

2、字符串處理函數

2.1、總覽

見下表:

01

2.2、連接符||及CONCAT函數

可以連接兩個列名或者常量。

比如:

?
1
 
  1. SELECT firstName||lastName FROM USER;

如果姓名為中文還好,但是如果是英文的,這樣連接會導致讀起來比較困難,所以可以在中間加上常量“空格”:

?
1
 
  1. SELECT firstName||' '||lastName FROM USER;

使用CONCAT函數也能達到同樣的效果:

?
1
 
  1. SELECT CONCAT(firstName,lastName) FROM USER;

結果:

02

但是CONCAT函數符合ANSI SQL標准,所以適合更多不同的數據庫,||是Oracle專有的,使用起來更簡潔。

2.3、格式統一:RPAD和LPAD

RPAD允許在列的右邊填充一組字符,填充的字符可以為任何字符。LPAD從左邊添加。

使用方式:

RPAD(string,length[,'set'])

LPAD(string,length[,'set'])

這里的string是數據庫中的字符串列或常量,length是填充后的長度,set是用來填充的字符串。如果方括號中的內容省略了,會默認使用空格填充。

RPAD的使用:

?
1
 
  1. SELECT rpad(lastname,10,'_') as name from users;

結果:

03

LPAD的使用:

?
1
 
  1. SELECT lpad(lastname,10) as name from users;

結果:

03

2.4、修剪:LTRIM,RTRIM,TRIM

LTRIM和RTRIM從串的左邊或右邊刪除不需要的字符。

使用方式:

RTRIM(string[,'set'])

LTRIM(string[,'set'])

如果沒有設置要刪除的值,默認刪除空格。

還是用例子來解釋,這里有一張存放書名的表,我們得到其書名列的值如下:

?
1
 
  1. SELECT name FROM BOOK;

04

這是因為錄入數據的不是同一個人,導致了數據格式不一致,首先我們來試一下LTRIM函數:

?
1
 
  1. SELECT LTRIM(name,'《') FROM BOOK;

05

可以看到左邊已經統一了,接下來就是右邊,我們很容易就能組合使用LTRIM和RTRIM:

?
1
 
  1. SELECT RTRIM(LTRIM(name,'《'),'》') FROM BOOK;

06

可以看到,查詢的結果已經統一了。可以一次刪除多個字符,只需要把要刪除的串設置進去即可。

我們在看一個例子,如果某個字段內容為:“the easy way”:

?
1
 
  1. INSERT INTO BOOK(ID,NAME) VALUES(6,'the easy way');

我們試着刪除前面的the和多余的空格,於是我們執行如下腳本:

?
1
 
  1. select ltrim(name,'the ') from book where id = 6;

結果:asy way

發現並不是我們想要的,以為LTRIM在刪除我們指定的字符串時,查找的不是這個字符串,而是里面的一個個字符,只有在第一次發現不屬於我們指定的字符串中的字符時才會退出。RTRIM和TRIM的原理也是一樣的。為了達到上面的目的,我們可以這樣做:

?
1
 
  1. select ltrim(ltrim(name,'the'),' ') from book where id = 6;

這樣就會輸出我們想要的結果。但是還有更為簡單的方式就是使用INSTR、SUBTR和DECODE函數,這在后面的文章中會介紹。

當我們兩邊要刪除的字符是相同的的時候,就可以使用TRIM函數,如果上例中,書名也可能是"think in java"(兩邊都是單引號)這樣的形式的話,如果想直接獲取單純的書名,就可以使用TRIM('"' from name):

?
1
 
  1. select trim('"' from name) from book where id=7;

注意TRIM中要刪除的只能是單個字符,形如TRIM('《》' from name)是錯誤的!

如果要從串的某一段刪除,可以使用LEADING和TRAILING字句,這時他們的作用於LTRIM和RTRIM是相同的:

?
1
 
  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
 
  1. select name,upper(name),lower(name),initcap(name) from book;

結果:

08

可以看到INITCAP不但將首字母大寫了,還將后面的字母轉換為小寫。

2.6、長度:LENGTH

使用LENGTH可以得到一個串的長度。

使用格式:

LENGTH(string)

例如:

?
1
 
  1. select name,length(name) from book;

結果:

09

2.7、子串:SUBSTR

使用SUBSTR函數可以提取出串的一部分。

使用格式:

SUBSTR(string,start[,count])

這個函數告訴Oracle提取string的一個子串,從start位置開始,長度為count個字符。如果不指定count,將從start開始一直到這個串結束。

如果有下面一張表:

?
1
 
  1. select * from phonebook;

10

如果我們需要不含區號的結果,可以這樣:

?
1
 
  1. select rpad(firstname||lastname,10,'.') as name,substr(phone,5) as phone from phonebook;

結果:

11

其中的start參數也可以是負值(僅當值類型為varchar2時,為char時不可用),這時就從串的末尾開始截取,比如上面的例子,也可以這樣:

?
1
 
  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
 
  1. SELECT name FROM BOOK;

12

執行如下語句:

?
1
 
  1. select name,instr(name,'a') from book;

13

再帶上start參數:

?
1
 
  1. select name,instr(name,'a',7) from book;

14

繼續加上occurrence參數:

?
1
 
  1. select name,instr(name,'a',1,2) from book;

15

當然,我們也可以查找一個串:

?
1
 
  1. select name,instr(lower(name),'java') from book;

16

我們也經常會將INSTR函數與||、SUBSTR等函數一起使用,比如還是這個例子:

?
1
 
  1. select * from phonebook;

17

我們要將各個列查詢出來組合成一個串,其中,phone中的區號不一定就得是3位區號,有些地區就是4位,我們可以使用如下語句:

?
1
 
  1. select firstname||lastname||':'||substr(phone,instr(phone,'-')+1) as phoneinfo from phonebook;

18

2.9、轉碼:ASCII和CHR

他們不常用。

CHR吧數值轉換為等價的ASCII字符串;ASCII相反,但效果只對傳遞給他的值的第一個字符起作用。

一個例子:

?
1
 
  1. select 70,chr(70),'F',ascii('F'),ascii('FOCUS') from dual;

輸出:70FF7070

3、在ORDER BY和WHERE子句中使用串函數

串函數可以直接用於WHERE子句中:

?
1
 
  1. select name from book where length(name)>10;

或者是ORDER BY子句中:

?
1
 
  1. select name from book order by length(name);

我們也可以使用前面介紹的函數用於復雜的子句,比如稍微復雜一點的:

?
1
 
  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
 
  1. select * from book where soundex(name) = soundex('java');

輸出:《Java編程思想》

SOUNDEX還可以結合Oracle Text工具在文章總搜索單詞,這會在后面專門介紹Oracle Text的文章中介紹。

4、小結

本文主要介紹了Oracle中字符串相關函數的使用。

有些函數可以在顯示前調整內容:RPAD、LPAD、LTRIM、RTRIM、TRIM、LOWER、UPPER、INITCAP、SUBSTR等。

還有些函數告訴我們串的相關信息:LENGTH、INSTR、SOUNDEX等。

這些函數都可以單獨或者組合使用。

后續會更新兩篇非常相關的文章,到時會將鏈接添加到下面:

  1. Oracle中的正則表達式 Oracle Text工具


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM