129

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

例如

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

SQL 服务器

  1. %
  2. _
  3. [说明符] 例如 [az]
  4. [^说明符]
  5. ESCAPE 子句 例如 %30!%%' ESCAPE '!' 将评估 30% 为真
  6. ' 字符需要用 ' 例如他们变成他们''

MySQL:

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

甲骨文:

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

赛贝斯

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

进步:

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

    参考指南在这里[PDF]

PostgreSQL:

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

ANSI SQL92:

  1. %
  2. _
  3. 仅当指定时才使用 ESCAPE 字符。

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

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

我们的想法是使它成为一个可以成为“一站式商店”的社区 Wiki。

4

5 回答 5

26

对于 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。

于 2009-04-03T04:54:09.463 回答
6

ANSI SQL92

  • %
  • _
  • 仅当指定时才使用 ESCAPE 字符。

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

在这里编写独立于 DBMS 的代码是不可能的,因为您不知道要转义哪些字符,并且标准规定您无法转义不需要转义的内容。(见第 8.5 节/一般规则/3.a.ii.)

谢谢你的SQL!gnnn

于 2009-04-03T06:25:04.970 回答
5

您应该补充一点,您必须在 SQL Server 中添加一个额外的 ' 来转义现有的 ':

史密斯 -> 史密斯的

于 2009-08-19T16:04:19.653 回答
1

赛基:

%              : 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."
于 2009-04-03T04:58:12.573 回答
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 '~'关键字可能允许自动转义字符串以在类似的表达式中使用。

于 2017-02-23T16:58:39.077 回答