天天看點

SQL截取函數(substr)與字元串查找函數(Instr)的組合應用

作者:腰鼓當當

大家好,在書寫SQL語句時,我們往往會遇到各種各樣的需求,本身資料庫就提供了很多系統函數供大家使用,本次我将向大家詳細介紹截取/切片相關需求場景的應用。

首先我們要對字段内的字元串内容進行分割、截取、切片。就需要資料庫提供的函數:substr()函數進行實作。

準備的字元串内容為:

select '我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,' from dual

一、截取函數:

通過該函數,可截取字元串内任何内容,函數格式:

Substr(char, startpos, length)

char:代表需要截取的字元串内容,如某個字段、某個字元串;

startpos:代表從第幾位開始,即起始位标記,當該值為正數時從左向右計算起始位,當該起始位為負數時則表示從右向左計算起始位;

length:代表從起始位開始截取多少位。

文字性描述不是很直覺,我們直接進行示範(下面示範均使用Oracle資料庫進行操作):

場景一:需要截取字元串内第一位到第六位:

select substr('我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,',1,6) from dual

我們可以看到,該字元串中第一位到第六位的内容“我叫腰鼓當當”就截取出來了;

SQL截取函數(substr)與字元串查找函數(Instr)的組合應用

截取函數輸出1-6結果

場景二:截取字元串後六位方式:

我們就可以使用負數“-6”來确定起始位,截取區間6位。如隻截取後六位我們也可以把第三位辨別内容忽略掉,如下兩個SQL寫法輸出的結果都是一樣的:

select substr('我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,',-6,6) from dual;

select substr('我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,',-6) from dual

SQL截取函數(substr)與字元串查找函數(Instr)的組合應用

截取後六位輸出結果

三、字元串查找函數Instr()

可以通過該函數擷取關鍵詞在字元串中的位置索引号,函數格式

Instr(char, search_string, startpos, occurrence)

char:表示目标字段或字元串内容

search_string:檢索的字元串内容,即需要檢索的關鍵詞

startpos:起始位,即出現的關鍵字第幾次為起始位

occurrence:擷取起始位開始後面第幾次出現關鍵詞的索引位置

場景一:擷取字元串第二個我出現的位置

select INSTR('我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,','我',1,2) from dual;

通過關鍵字‘我’,加上“1”起始出現的位置,第“2”次出現關鍵字,最終鎖定了字元串中第二個我的位置,如下。

SQL截取函數(substr)與字元串查找函數(Instr)的組合應用

字元串查找第二個我出現的位置結果

四、簡單的介紹完截取函數(substr)的用法後,我們将把難度提高一下,下面的需求内容則根據上列字元串内容截取:第二次出現的“我”作為起始位,結束位則是第二次出現的“,”逗号之間的内容;該場景在日常應用過程中經常會出現。讓我們來分析一下;

按照剛才學習的思路,我們可以書寫成substr('我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,',8,21)。但是現實場景中不可能讓你知道所有字元串的位置并逐一寫substr。這時候我們加入instr函數即可完美解決該場景。

select substr(strnote,

INSTR(strnote, '我', 1, 2),

INSTR(strnote, ',', 1, 2) - INSTR(strnote, '我', 1, 2))

from (select '我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,' as strnote

from dual)

我們通過instr函數擷取了第二個“我”的位置和第二個“,”位置;下列SQL中為什麼要對截取長度進行減法操作呢,因為我們擷取的都是兩個值的絕對字元串位置,而通過兩個位置值相減才能擷取到“我”到“,”之間的長度。最終就可以輸出下列結果内容:

SQL截取函數(substr)與字元串查找函數(Instr)的組合應用

截取内容結果