在下面的sql中,escape的用法是什麼?在select語句中轉義
select * from dual where dummy like 'funny&_' escape '&';
SQL * Plus詢問_的值是否指定了轉義。
在下面的sql中,escape的用法是什麼?在select語句中轉義
select * from dual where dummy like 'funny&_' escape '&';
SQL * Plus詢問_的值是否指定了轉義。
轉義字符用於表示下劃線應該匹配爲實際字符,而不是單字符通配符。 This is explained in the documentation。
可以通過使用ESCAPE子句,其識別轉義字符包括在所述圖案的實際字符%或_。如果轉義字符在模式中的字符%或_之前,那麼Oracle將在該模式中逐字地解釋該字符,而不是作爲特殊的模式匹配字符。
如果你沒有足夠的例外條款,則下劃線將匹配任何單個字符,所以where dummy like 'funny_'
將匹配'funnyA'
,'funnyB'
等,不只是實際的下劃線。
您選擇的轉義字符是&
,這是默認的SQL * Plus客戶端substitution variable標記。它與escape
子句無關,並且使用該子句導致模式的&_
部分被解釋爲名爲_
的替代變量,因此會提示您。由於它不相關,所以escape
子句對此沒有影響。
最簡單的事情可能是選擇一個不同的轉義字符。如果要使用特定的轉義字符,而不是提示,disable or change the substitution character:
set define off
select * from dual where dummy like 'funny&_' escape '&';
set define on
那麼就會在那裏假正好包含字符串匹配'funny_'
行。 (因此它相當於where dummy = 'funny_'
,因爲沒有未轉義的通配符,因此like
模式匹配冗餘)。它不會匹配任何開始與該模式(這有點像使用regexp_like
與開始和結束錨點,你可能會期望它的工作,如果你沒有提供錨點,但它不)。您將需要添加一個通配符%爲:
set define off
select * from dual where dummy like 'funny&_%' escape '&';
set define on
如果你想匹配任何不以funny_
開始,但有它的地方在的中間值,則需要添加一個通配符之前太:
set define off
select * from dual where dummy like '%funny&_%' escape '&';
set define on
您還沒有表現出任何的樣本數據或預期結果,目前尚不清楚你需要的模式。
SQL小提琴沒有替換變量,但是here's an example顯示了這三個模式如何匹配各種值。
是否有一個示例,其中有一行來自select而不是「未選擇行」?我嘗試了一些,只是得到了。 – user2018791
@ user2018791 - 取決於您的數據。也許你想在'funny'之前使用%通配符,如果它出現在值的中間?但是,如果你真的在查詢'dual',那麼你就永遠不會匹配,因爲它有一個'dummy'值爲'X'的單行。 –
escape子句的用途是停止通配符(例如,從%
或_
)被視爲通配符,按the documentation
爲什麼你會被提示輸入的_
值的原因是因爲你使用&
,這也是通常使用的字符提示輸入替換變量。
要停止後者情況發生,你可以:
set define off
(或作爲腳本之前在GUI中,例如Toad)或關閉替換變量提示如果您使用GUI。set define <character>
爲SQL LIKE條件的語法定義字符不同的東西是:
expression LIKE pattern [ ESCAPE 'escape_character' ]
參數或參數
expression
:一個字符表達這樣作爲列或字段。pattern
:包含模式匹配的字符表達式。你可以選擇的模式是:
Wildcard | Explanation
---------+-------------
% | Allows you to match any string of any length (including zero length)
_ | Allows you to match on a single character
escape_character
:可選。它允許您測試通配符的文字實例,如%或_。
我覺得文檔解釋了這個非常好:https://docs.oracle.com/cd/B12037_01/server.101/b10759/conditions016.htm。 –
請提供您正在嘗試獲取的示例數據。 –