SQL LIKE子句的特殊字符列表


119

LIKE子句的SQL的所有特殊字符的完整列表是什么(我对SQL Server感兴趣,但也可以使用其他字符)?

例如

SELECT Name FROM Person WHERE Name LIKE '%Jon%'

SQL Server

  1. _
  2. [说明者]例如[az]
  3. [^说明符]
  4. ESCAPE子句,例如%30!%%'ESCAPE'!' 将30%视为正确
  5. '字符需要用'转义,例如

MySQL:

  1. % -零个或多个字符的任何字符串。
  2. _ -任何单个字符
  3. ESCAPE子句,例如%30!%%'ESCAPE'!' 将30%视为正确

甲骨文:

  1. % -零个或多个字符的任何字符串。
  2. _ -任何单个字符
  3. ESCAPE子句,例如%30!%%'ESCAPE'!' 将30%视为正确

Sybase公司

  1. _
  2. [说明者]例如[az]
  3. [^说明符]

进展:

  1. % -零个或多个字符的任何字符串。
  2. _ -任何单个字符

    参考指南在这里 [PDF]

PostgreSQL:

  1. % -零个或多个字符的任何字符串。
  2. _ -任何单个字符
  3. ESCAPE子句,例如%30!%%'ESCAPE'!' 将30%视为正确

ANSI SQL92:

  1. _
  2. 仅在指定时使用ESCAPE字符。

PostgreSQL还具有SIMILAR TO添加以下内容的运算符:

  1. [specifier]
  2. [^specifier]
  3. | -两种选择之一
  4. * -重复上一个项目零次或多次。
  5. + -重复上一个项目一次或多次。
  6. () -将项目分组在一起

想法是使它成为一个社区Wiki,可以为此而成为“一站式商店”。


值得一提的是ESCAPE子句。SQL Server,Oracle和MySQL均支持此功能。不了解Sybase。
Dave Webb

我想现在的ESCAPE子句是标准的SQL所以大概只需要一提的一次
戴夫·韦伯

我不知道自己在所有列出的服务器(以及以后可能添加的任何服务器)中都实现了它,因此我不愿意将其引入“所有支持”部分。如果您有信心获得所有支持,请继续。
乔纳森·帕克

别忘了逃脱逃生角色本身...
ChristofferHammarström2014年

两个评论。首先,Microsoft SQL最初来自Sybase,因此相似之处并非偶然。其次,用单引号引起来的转义不限于LIKE;例如WHERE familyname = 'O''Toole'。第三,SIMILAR TO运算符引入了一种混合正则表达式,它具有自己的功能(以及更多特殊字符),因此可能不应该包含在这里。我想这有3条评论,但没人期待西班牙宗教裁判所。
芒果

Answers:


22

对于SQL Server,可从http://msdn.microsoft.com/en-us/library/ms179859.aspx进行

  • %零个或多个字符的任何字符串。

    WHERE title LIKE '%computer%' 在书名中的任何位置查找所有带有“计算机”一词的书名。

  • _任何单个字符。

    WHERE au_fname LIKE '_ean' 查找以ean结尾的所有四个字母的名字(Dean,Sean等)。

  • []指定范围([af])或集合([abcdef])中的任何单个字符。

    WHERE au_lname LIKE '[C-P]arsen'查找以arsen结尾且以C和P之间的任何单个字符开头的作者姓氏,例如Carsen,Larsen,Karsen等。在范围搜索中,范围中包括的字符可能会根据归类的排序规则而有所不同。

  • [^]不在指定范围([^ af])或集合([^ abcdef])中的任何单个字符。

    WHERE au_lname LIKE 'de[^l]%' 所有作者的姓氏均以de开头,且以下字母不是l。


1
我刚刚尝试过,看来可以。但它不是像正则表达式=> [0-9]相反,你需要指定每个字符是这样的:[0123456789]
Çağdaş特勤

3
等一下 就像RegEx一样,[0-9]也可以工作。对困惑感到抱歉。
Çağdaş特勤

6

ANSI SQL92

  • _
  • 仅在指定时使用ESCAPE字符。

令人失望的是,许多数据库不遵循标准规则并添加额外的字符,或者在缺少默认值'\'时错误地启用了ESCAPE。好像我们对'\'还没有足够的麻烦!

在这里编写与DBMS无关的代码是不可能的,因为您不知道必须转义哪些字符,并且标准说您无法转义不需要转义的内容。(请参阅第8.5节/一般规则/3.a.ii。)

谢谢SQL!gnnn


5

您应该补充一点,您必须在SQL Server中添加一个额外的“以逃避现有的”:

史密斯->史密斯


1

Sybase:

%              : Matches any string of zero or more characters.
_              : Matches a single character.
[specifier]    : Brackets enclose ranges or sets, such as [a-f] 
                 or [abcdef].Specifier  can take two forms:

                 rangespec1-rangespec2: 
                   rangespec1 indicates the start of a range of characters.
                   - is a special character, indicating a range.
                   rangespec2 indicates the end of a range of characters.

                 set: 
                  can be composed of any discrete set of values, in any 
                  order, such as [a2bR].The range [a-f], and the 
                  sets [abcdef] and [fcbdae] return the same 
                  set of values.

                 Specifiers are case-sensitive.

[^specifier]    : A caret (^) preceding a specifier indicates 
                  non-inclusion. [^a-f] means "not in the range 
                  a-f"; [^a2bR] means "not a, 2, b, or R."

0

SQL Server的潜在答案

有趣的是,我刚刚在SQL Server上使用LinqPad进行了测试,该测试应该仅在下面运行Linq to SQL并生成以下SQL语句。

记录.Where(r => r.Name.Contains(“ lkjwer --_〜[]”))

-- Region Parameters
DECLARE @p0 VarChar(1000) = '%lkjwer--~_~~~[]%'
-- EndRegion
SELECT [t0].[ID], [t0].[Name]
FROM [RECORDS] AS [t0]
WHERE [t0].[Name] LIKE @p0 ESCAPE '~'

因此,我尚未对其进行测试,但看起来该ESCAPE '~'关键字可能允许自动转义用于在like表达式中使用的字符串。


他们可能只是在使用,ESCAPE因为它允许每个转义字符使用两个字符(例如,%变成~%)而不是三个字符(例如,不使用ESCAPE%变成[%])。
宾基'18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.