【问题标题】:List of special characters for SQL LIKE clauseSQL LIKE 子句的特殊字符列表
【发布时间】:2010-10-17 06:56:06
【问题描述】:

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

例如

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

SQL Server:

  1. %
  2. _
  3. [说明符] 例如[a-z]
  4. [^说明符]
  5. ESCAPE 子句%30!%%'ESCAPE'!'将评估 30% 为 true
  6. ' 字符需要使用 ' 进行转义,例如他们变成了他们

MySQL:

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

Oracle:

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

Sybase

  1. %
  2. _
  3. [说明符] 例如[a-z]
  4. [^说明符]

Progress:

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

    Reference Guide here [PDF]

PostgreSQL:

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

ANSI SQL92:

  1. %
  2. _
  3. ESCAPE 字符仅在指定时

PostgreSQL 也有 SIMILAR TO 运算符,它添加了以下内容:

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

我们的想法是让这个社区 Wiki 成为一个“一站式商店”。

【问题讨论】:

  • 可能值得一提的是 ESCAPE 子句。 SQL Server、Oracle 和 MySQL 都支持这一点。不了解 Sybase。
  • 我现在在想 ESCAPE 子句是标准 SQL,所以可能只需要提及一次
  • 我自己不知道它在所有列出的服务器(以及以后可能添加的任何服务器)中都实现了,所以我不愿意将它拉到“所有支持”部分。如果您确信它们都得到支持,请继续。
  • 别忘了转义转义字符本身...
  • 两个厘米。首先,Microsoft SQL 最初来自 Sybase,因此相似之处并非巧合。二、单引号转义不限于LIKE;例如WHERE familyname = 'O''Toole'。第三,SIMILAR TO 运算符引入了一种混合正则表达式,它有自己的特性(以及更多特殊字符),因此可能不应该包含在此处。我猜这可以赚 3 cmets,但没人会想到西班牙宗教裁判所。

标签: sql special-characters sql-like


【解决方案1】:

对于 SQL Server,来自http://msdn.microsoft.com/en-us/library/ms179859.aspx

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

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

  • _ 任意单个字符。

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

  • [ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 内的任何单个字符。

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

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

    WHERE au_lname LIKE 'de[^l]%'所有作者姓氏以de开头且后面的字母不是l的地方。

【讨论】:

  • 我刚试过,看起来你可以。但它不像正则表达式 => [0-9] 而是你需要像这样指定每个字符:[0123456789]
  • 等等,不。它就像正则表达式,所以 [0-9] 也可以。很抱歉造成混乱。
【解决方案2】:

ANSI SQL92:

  • %
  • _
  • ESCAPE 字符仅在指定时

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

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

感谢 SQL!呸呸呸

【讨论】:

    【解决方案3】:

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

    史密斯的 -> 史密斯的

    【讨论】:

      【解决方案4】:

      赛贝斯:

      %              : 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."
      

      【讨论】:

        【解决方案5】:

        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 '~' 关键字可能允许自动转义字符串以在类似的表达式中使用。

        【讨论】:

        • 他们可能只是使用ESCAPE,因为它允许每个转义字符使用两个字符(例如,% 变为~%)而不是三个(例如,没有ESCAPE,@987654327 @ 变为 [%])。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 2014-09-23
        • 1970-01-01
        相关资源
        最近更新 更多