1. 程式人生 > 其它 >Oracle REGEXP_SUBSTR 字串擷取函式的使用

Oracle REGEXP_SUBSTR 字串擷取函式的使用

技術標籤:150-Db SQL語言REGEXP_SUBSTROracle

函式作用

使用正則表達是從字串中擷取字串

語法

REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)

引數說明:

  1. String, 原字串
  2. pattern, 進行匹配的正則表示式
  3. position, 起始位置, 從第幾個字元開始匹配查詢, 預設為 1
  4. occurrence, 取第幾次匹配的值。
  5. modifier , 模式, 可以取的值有
  • i 不區分大小寫
  • c 區分大小寫 , 預設值

示例

對逗號分隔的字串 11,22,33 按逗號進行分割。

解析:
該處使用正則表示式 [^,]+

  • 中括號[] 中的內容代表可選字符集
  • ^ 在正則表示式中一般用於匹配輸入字串的開始位置, 但在中括號中代表反選,也就是排除的字元。
  • + 代表匹配一次或多次
    所以綜合起來, 以上正則表達是的意義是: 匹配不包含逗號的非空字串。

查詢匹配的第1個值

SELECT REGEXP_SUBSTR('11,12,13','[^,]+',1,1) AS STR FROM DUAL;   -- 11

查詢匹配的第2個值

SELECT REGEXP_SUBSTR('11,12,13','[^,]+',1,2) AS STR FROM DUAL;   -- 12

查詢匹配的最後一個

在不知道具體長度時,可以結合length和regexp_replace 函式運算出分隔符的數量或是匹配到的總數。

思路就是: 將分隔符(這裡是,)使用regexp_replace刪除掉, 用原字元長長度減去替換後的字串長度, 就是包含的分割符的數量,分隔符數量加1 ,就是總共匹配的數量了。

select length('11,12,13')-length(regexp_replace('11,12,13',',','' ))+1 from dual;  --3

結合上面的方式, 匹配最後一個值的完整SQL如下:

SELECT REGEXP_SUBSTR('11,12,13','[^,]+',1,length('11,12,13')-length(regexp_replace('11,12,13',',','' ))+1) AS STR FROM DUAL;   -- 13