大家好,在書寫SQL語句時,我們往往會遇到各種各樣的需求,本身資料庫就提供了很多系統函數供大家使用,本次我将向大家詳細介紹截取/切片相關需求場景的應用。
首先我們要對字段内的字元串内容進行分割、截取、切片。就需要資料庫提供的函數:substr()函數進行實作。
準備的字元串内容為:
select '我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,' from dual
一、截取函數:
通過該函數,可截取字元串内任何内容,函數格式:
Substr(char, startpos, length)
char:代表需要截取的字元串内容,如某個字段、某個字元串;
startpos:代表從第幾位開始,即起始位标記,當該值為正數時從左向右計算起始位,當該起始位為負數時則表示從右向左計算起始位;
length:代表從起始位開始截取多少位。
文字性描述不是很直覺,我們直接進行示範(下面示範均使用Oracle資料庫進行操作):
場景一:需要截取字元串内第一位到第六位:
select substr('我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,',1,6) from dual
我們可以看到,該字元串中第一位到第六位的内容“我叫腰鼓當當”就截取出來了;
截取函數輸出1-6結果
場景二:截取字元串後六位方式:
我們就可以使用負數“-6”來确定起始位,截取區間6位。如隻截取後六位我們也可以把第三位辨別内容忽略掉,如下兩個SQL寫法輸出的結果都是一樣的:
select substr('我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,',-6,6) from dual;
select substr('我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,',-6) from dual
截取後六位輸出結果
三、字元串查找函數Instr()
可以通過該函數擷取關鍵詞在字元串中的位置索引号,函數格式
Instr(char, search_string, startpos, occurrence)
char:表示目标字段或字元串内容
search_string:檢索的字元串内容,即需要檢索的關鍵詞
startpos:起始位,即出現的關鍵字第幾次為起始位
occurrence:擷取起始位開始後面第幾次出現關鍵詞的索引位置
場景一:擷取字元串第二個我出現的位置
select INSTR('我叫腰鼓當當,我在教大家使用SQL語句,我是如何切片的,','我',1,2) from dual;
通過關鍵字‘我’,加上“1”起始出現的位置,第“2”次出現關鍵字,最終鎖定了字元串中第二個我的位置,如下。
字元串查找第二個我出現的位置結果
四、簡單的介紹完截取函數(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中為什麼要對截取長度進行減法操作呢,因為我們擷取的都是兩個值的絕對字元串位置,而通過兩個位置值相減才能擷取到“我”到“,”之間的長度。最終就可以輸出下列結果内容:
截取内容結果