Oracle 解決like中無法匹配下劃線的問題

Iven_lin發表於2024-04-02
如果想檢索出欄位中包含下劃線“_”的內容,該如何書寫SQL語句呢?
之所以問這個問題,是因為在Oracle中下劃線在like中有著特殊的含義,它表示匹配任意一個字元。因此在查詢包含下劃線內容的時候需要“特殊關照”一下。
既然被問到了這個問題,簡單記錄一下兩種規避的方法,供參考。

1.建立實驗表,並初始化三條資料
sec@ora10g> create table t (x varchar2(10));

Table created.

sec@ora10g> insert into t values ('sec');

1 row created.

sec@ora10g> insert into t values ('secooler');

1 row created.

sec@ora10g> insert into t values ('sec_ooler');

1 row created.

sec@ora10g> commit;

Commit complete.

2.確認表T中的資料,其中包含兩條不帶下劃線的內容,一條帶下劃線的內容。
sec@ora10g> select * from t;

X
----------
sec
secooler
sec_ooler

3.使用like語句的錯誤查詢
sec@ora10g> select * from t where x like '%_%';

X
----------
sec
secooler
sec_ooler

為什麼錯誤?
因為在like語句中的下劃線的含義是“任意一個字元”,類似“%”代表匹配任意多個字元的。

4.正確的查詢方法
能想到的有如下兩種方法。
1)第一種方法使用escape轉義
sec@ora10g> select * from t where x like '%\_%' escape '\';

X
----------
sec_ooler

escape的內容可以任意,只要保證前後一致即可。
sec@ora10g> select * from t where x like '%|_%' escape '|';

X
----------
sec_ooler

sec@ora10g> select * from t where x like '%*_%' escape '*';

X
----------
sec_ooler

2)使用instr函式輔助判斷
使用instr函式判斷欄位中是否包含“_”,如果包含返回值是非零的,如果不包含則返回值是零。
sec@ora10g> select * from t where instr(x,'_')!=0;

X
----------
sec_ooler

3)
sec@ora10g> select ascii('_') from dual;

ASCII('_')
----------
95

5.小結
任何語言都存在需要“特殊關照”的情況,這需要具體問題具體分析,發現一個問題解決一個問題,不積跬步無以至千里。

相關文章