iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0

Oracle也支援正規表達式(Regular Expressions),透過正規表達式可以進行更多元化的比較,此篇會針對正規表式進行說明。通過使用 REGEXP_LIKEREGEXP_INSTRREGEXP_SUBSTRREGEXP_REPLACE 正規表達式的函數,可以在 SQL 查詢中更有效地處理複雜的字串比對查詢。

何謂正規表達式?

前面教學過like語法,可以透過 % 或者 _ 等簡單的保留字進行字串比對,但如果今天想再 多個 條件集合中進行比對,則強烈建議使用 正規表達式 來完成。

舉一個生活化的例子來說,想從水果籃中挑出草莓或者蘋果

with fruits as(
  select 'apple' name from dual
  union all
  select 'banana' name from dual
  union all
  select 'blueberry' name from dual
  union all
  select 'strawberry' name from dual
  union all
  select 'pomelo' name from dual
)
  1. 使用 like 語法
SELECT f.name
FROM fruits f
where 1=1
and (f.name like '%apple%' 
      or
    f.name like '%strawberry%') 
;
  1. 使用 正規表達式 語法
SELECT f.name
FROM fruits f
where 1=1
and REGEXP_LIKE(f.name, '(apple|strawberry)') 

正規表達式保留字

正則表達式符號 功能
. 匹配 任何單一字元,除換行符號。例:a.b 可以匹配 "acb""a1b"
* 匹配 0 個前面字元或表達式。例:a* 匹配 """a""aa"
+ 匹配 1 個前面字元或子表達式。例:a+ 匹配 "a""aa""aaa" 等,但不匹配空字串
? 匹配 01 個前面字元或子表達式。例:a? 匹配 """a" 等,但不匹配空字串
| 表示邏輯 。例:apple|banana 匹配 "apple""banana"
^ 匹配字串的 開頭。例:^abc 匹配以 "abc"XXX 開頭的字串
$ 匹配字串的 結尾。例:abc$ 匹配以 XXX"abc" 結尾的字串
[] 匹配指定範圍內的任何單一字元。例:[abc] 匹配 "a""b""c"
() 定義子表達式,用於分組。例:(abc)+ 匹配 "abc""abcabc"
[^...] 匹配 在指定範圍內的任何單一字元。例:[^abc] 匹配 "d""1",但不匹配 "a""c"
{m} 匹配前面的字元恰好 m 次。例:a{3} 匹配 "aaa"
{m,} 匹配前面的字元至少 m 次。例:a{3,} 匹配 "aaaaa"
{m,n} 至少匹配 m 次,但不超過 n 次。例:a{2,4} 匹配 "aa""aaa""aaaa"
\ 用於跳脫特殊字元。例:\. 匹配 "."\\ 匹配 "\"
\n 向後引用捕獲子表達式。例:(\w+)\s\1 匹配 "word word" 中的 "word"

正規表達式函數

函數名 說明
REGEXP_LIKE 執行正規表示式的 LIKE 字串條件比對
REGEXP_INSTR 執行正規表示式的 INSTR 搜尋項目位置功能
REGEXP_REPLACE 執行正規表示式的 REPLACE 替換字串功能
REGEXP_SUBSTR 執行正規表示式的 SUBSTR 比對字串是否含有符合條件式的子字串,將之回傳
  • example
-- 字串第一個 `A` 開頭的子字串
SELECT REGEXP_SUBSTR('A123 B456 A789', 'A[^ ]*') AS substring FROM dual;
> A123

-- 將字串中的所有數字替換為 X
SELECT REGEXP_REPLACE('AB123CD456', '[0-9]', 'X') AS replaced_string FROM dual;
> ABXXXCDXXX

Reference


上一篇
Day 15 基礎-一變多行
下一篇
Day 17 基礎-樞紐分析
系列文
不居功的系統隱士 - 30天由淺入深學SQL30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言