【问题标题】:How to escape a string for use with the LIKE operator in SQL Server?如何转义字符串以与 SQL Server 中的 LIKE 运算符一起使用?
【发布时间】:2010-11-28 12:43:33
【问题描述】:

我正在寻找在 SQL Server 中工作的东西,类似于 c# 中的 @ 符号,它会导致字符串被视为文字。例如:

string text = "abcd\\efg";
Output of text = abcd\efg

string text = @"abcd\\efg";
Output of text = abcd\\efg

请注意 @ 如何影响字符串以按原样获取每个字符。

现在我不确定这是否可行,但这是我的问题,也许有更好的方法来解决这个问题。考虑以下基本查询:

SELECT [Name] 
  FROM [Test] 
 WHERE [Name] LIKE (@searchText + '%')

我的问题是他们是否输入了%_ 或任何其他可能影响我的like 子句的特殊字符。我希望比赛就像一个“开始于”功能。那么有什么我可以应用到@searchText 来说明字面意思,或者是否有更好的解决方案我没有想到?

编辑:我不希望解决方案是客户端清洁。我需要这个存储过程在不依赖于被清理的数据的情况下工作。

【问题讨论】:

标签: sql sql-server tsql pattern-matching


【解决方案1】:

要在字符串中搜索“%”作为文字而不是通配符,需要将其转义为 [%]。

现在,SQL Server 只需要转义 3 个字符:% _ [

所以,创建一个标量 udf 来包装它:

REPLACE(REPLACE(REPLACE(@myString, '[', '[[]'), '_', '[_]'), '%', '[%]')

由于 SQL 中的模式匹配简单(又名:非常有限),因此不需要更复杂的...

【讨论】:

    【解决方案2】:

    在 TSQL 中,您可以将 % 和 _ 字符括在括号中,例如 [%] [_] 这告诉 SQL 将它们视为文字。

    我已在 SQL Server 7.0、2000 和 2005 中测试并验证了此功能。

    http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx

    【讨论】:

    • 所以这样做 "...where columnName LIKE '[%]foo%'" 实际上会搜索以 "%foo" 开头的任何值(% 充当文字,而不是通配符? 我没有意识到这一点。
    • 这不适用于字符串文字。
    • 啊,我的立场是正确的。我在 10 年里从未见过这种用法。 :-P
    • 我做 SQL 也已经 10 年了,昨天才知道这一点,因为我无法让 like 语句使用下划线。所以我阅读了文档并看到了曙光。
    • 那么如果我的字符串中已经有一个 [ 像:ab[%]cd 并且我希望它实际上完全匹配会发生什么?
    【解决方案3】:

    每个要按字面处理的字符都应该用方括号括起来。右括号是直接使用的,所以不要括起来。

    【讨论】:

      【解决方案4】:

      如果您将查询参数化,则无需担心。

      更新

      正如 cmets 中的递归所述,即使在参数化查询中仍然需要转义 %,我在测试时没有意识到 linq to sql 是自动执行的。

      您可以使用 ESCAPE 'x' 其中 x 是您希望成为转义字符的字符。 Linq to SQL 是这样做的

      WHERE [Name] LIKE @searchText ESCAPE '~'

      其中@searchText = [一些带有~%字符%的文本]

      或者正如其他人所说,它可以用 [%] 转义

      view the documentation

      【讨论】:

      • 这不是真的。自己试试吧。
      • OP 中的问题与参数化查询无关。问题在有或没有参数的情况下都有效
      • 我没有意识到这一点。 Linq to SQL 会自动执行此操作。我已经更正了我的答案。
      【解决方案5】:

      我会在前端应用程序中清理字符串,而不是尝试在 SQL 中做一些虚假的事情来解决这个问题。

      【讨论】:

      • 如果您在文本中实际需要百分号或下划线怎么办?
      • 我不希望我的存储过程依赖于调用者传递它清理的数据。
      【解决方案6】:

      来自the docs

      语法

      match_expression [ NOT ] LIKE 模式 [ ESCAPE escape_character ]

      像这样使用ESCAPE 选项:

      SELECT [Name] 
        FROM [Test] 
       WHERE [Name] LIKE (REPLACE(@searchText, '%', '%%') + '%') ESCAPE '%'
      

      【讨论】:

      • 我想到了这条路线,但我需要为 %、_、[、] 和任何其他字符执行此操作吗?这似乎需要大量的搜索和替换。
      【解决方案7】:

      如果不想修改传入的文本,可以使用“LEFT”功能创建自己的“STARTSWITH”:

      SELECT [Name] 
        FROM [Test] 
       WHERE @searchText = LEFT( [Name], LEN( @searchText ) )
      

      (请注意,您可能需要做额外的工作来处理 NULL 或空字符串的情况。)

      编辑:删除了关于使用“LIKE”搜索“%”的错误语句。

      【讨论】:

      • 这似乎是很常见的误解,但您可以在 LIKE 比较中转义 % 和 _
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多