在下面的sql中,使用escape是什么?
select * from dual where dummy like 'funny&_' escape '&';
SQL * Plus要求_的值是否指定了转义。
答案 0 :(得分:3)
escape子句的目的是阻止通配符(例如%
或_
)被视为通配符,如the documentation
您被提示输入_
的值的原因是因为您使用的是&
,它通常也是用于提示替换变量的字符。
要阻止后者发生,你可以:
set define off
,如果您使用的是GUI,请关闭替换变量提示set define <character>
答案 1 :(得分:2)
转义字符用于指示下划线应匹配为实际字符,而不是单字符通配符。 jQuery API Docs
This is explained in the documentation
您可以使用ESCAPE子句在模式中包含实际字符%或_,该子句标识转义字符。如果转义字符在模式中的字符%或_之前,则Oracle会在模式中按字面解释此字符,而不是作为特殊的模式匹配字符。
如果您没有escape子句,则下划线将匹配任何单个字符,因此'funnyA'
将匹配'funnyB'
,&
等,而不仅仅是实际的下划线。
您选择的转义字符是escape
,它是默认的SQL * Plus客户端标记。它与&_
子句无关,使用它会导致模式的_
部分被解释为名为escape
的替换变量,因此会提示您。由于它不相关,set define off
select * from dual where dummy like 'funny&_' escape '&';
set define on
子句对此没有影响。
最简单的事情可能是选择一个不同的转义字符。如果要使用该特定转义字符而不提示,substitution variable:
'funny_'
然后匹配其中dummy包含字符串where dummy = 'funny_'
的行。 (因此它等同于like
,因为没有未转义的通配符,使regexp_like
模式匹配变得多余。它与 start 与该模式的任何匹配都不匹配(有点像使用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
开头的但是在值的中间位置,你需要在它之前添加另一个通配符:
{{1}}
您尚未显示任何样本数据或预期结果,因此不清楚您需要哪种模式。
SQL Fiddle没有替换变量,disable or change the substitution character显示这三种模式如何匹配各种值。
答案 2 :(得分:1)
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
:可选。它允许您测试通配符的文字实例,例如%或_。