Oracle也支援正規表達式(Regular Expressions),透過正規表達式可以進行更多元化的比較,此篇會針對正規表式進行說明。通過使用 REGEXP_LIKE
、REGEXP_INSTR
、REGEXP_SUBSTR
和 REGEXP_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
)
like
語法SELECT f.name
FROM fruits f
where 1=1
and (f.name like '%apple%'
or
f.name like '%strawberry%')
;
正規表達式
語法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" 等,但不匹配空字串 |
? |
匹配 0 或 1 個前面字元或子表達式。例: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 比對字串是否含有符合條件式的子字串,將之回傳 |
-- 字串第一個 `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