在select语句中转义

时间:2016-01-19 12:01:45

标签: sql oracle select

在下面的sql中,使用escape是什么?

select * from dual where dummy like 'funny&_' escape '&';

SQL * Plus要求_的值是否指定了转义。

3 个答案:

答案 0 :(得分:3)

escape子句的目的是阻止通配符(例如%_)被视为通配符,如the documentation

您被提示输入_的值的原因是因为您使用的是&,它通常也是用于提示替换变量的字符。

要阻止后者发生,你可以:

  • 更改为其他转义字符
  • 在运行语句之前,如果您正在使用SQL * Plus(或作为GUI中的脚本,例如Toad),请运行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客户端like condition标记。它与&_子句无关,使用它会导致模式的_部分被解释为名为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:可选。它允许您测试通配符的文字实例,例如%或_。

来源:http://www.techonthenet.com/sql/like.php