【问题标题】:SQL 'LIKE' query using '%' where the search criteria contains '%'使用 '%' 的 SQL 'LIKE' 查询,其中搜索条件包含 '%'
【发布时间】:2012-06-03 22:23:22
【问题描述】:

我有一个如下的 SQL 查询。

Select * from table 
where name like '%' + search_criteria + '%' 

如果 search_criteria = 'abc',它将返回包含xxxabcxxxx 的数据,这很好。

但是如果我的search_criteria = 'abc%',它仍然会返回包含xxxabcxxx的数据,这不应该是这样的。

我该如何处理这种情况?

【问题讨论】:

  • 那为什么要添加自己的 %?
  • 怎么做取决于你的引擎,但显然你必须逃避你自己的%
  • 你用的是什么编程语言?
  • 使用 MATCH 而不是 LIKE。

标签: sql sql-server sql-like


【解决方案1】:

如果您希望将search_criteria 中的% 符号视为文字字符而不是通配符,请将其转义为[%]

... where name like '%' + replace(search_criteria, '%', '[%]') + '%'

【讨论】:

  • 谢谢你,给出带有 % 符号的列select * from tablename where Column like '%[%]%'
【解决方案2】:

使用转义子句:

select *
  from (select '123abc456' AS result from dual
        union all
        select '123abc%456' AS result from dual
       )
  WHERE result LIKE '%abc\%%' escape '\'

结果

123abc%456

您可以将转义字符设置为任何您想要的字符。在这种情况下,默认为 '\'。转义的 '\%' 变成文字,第二个 '%' 没有转义,所以又是通配符。

List of special characters for SQL LIKE clause

【讨论】:

    【解决方案3】:

    最简单的解决方案是完全省去“喜欢”:

    Select * 
    from table
    where charindex(search_criteria, name) > 0
    

    我更喜欢 charindex 而不是 like。从历史上看,它有更好的性能,但我不确定它现在是否有很大的不同。

    【讨论】:

    • 我真的很喜欢这个答案,因为它显然不容易受到 SQL 注入的影响,因为您避免了字符串连接。
    • 查看sql-server-performance 进行简短比较。请注意,使用like 'findme%' 仍然可以使用索引(如果存在)。
    【解决方案4】:

    要转义 sql 中的字符,您可以使用 !:


    示例 - 使用转义字符

    在模式匹配时了解如何“转义字符”很重要。这些示例专门处理 Oracle 中的转义字符。

    假设您想在 SQL LIKE 条件中搜索 % 或 _ 字符。您可以使用转义字符来执行此操作。

    请注意,您只能将转义字符定义为单个字符(长度为 1)。

    例如:

    SELECT *
    FROM suppliers
    WHERE supplier_name LIKE '!%' escape '!';
    

    此 SQL LIKE 条件示例标识 !字符作为转义字符。此语句将返回名称为 % 的所有供应商。

    这是在 SQL LIKE 条件中使用转义字符的另一个更复杂的示例。

    SELECT *
    FROM suppliers
    WHERE supplier_name LIKE 'H%!%' escape '!';
    

    此 SQL LIKE 条件示例返回名称以 H 开头并以 % 结尾的所有供应商。例如,它会返回一个值,例如 'Hello%'。

    您还可以在 SQL LIKE 条件中使用带有 _ 字符的转义字符。

    例如:

    SELECT *
    FROM suppliers
    WHERE supplier_name LIKE 'H%!_' escape '!';
    

    此 SQL LIKE 条件示例返回名称以 H 开头并以 _ 结尾的所有供应商。例如,它会返回一个值,例如 'Hello_'。


    参考:sql/like

    【讨论】:

      【解决方案5】:
      Select * from table where name like search_criteria
      

      如果您希望用户添加自己的通配符...

      【讨论】:

        【解决方案6】:

        您需要转义它:在许多数据库中,这是通过在它前面加上反斜杠 \% 来完成的。

        所以abc 变成了abc\%

        您的编程语言将有一个特定于数据库的功能来为您执行此操作。例如,PHP 具有用于MySQL 数据库的 mysql_escape_string()。

        【讨论】:

          【解决方案7】:

          转义百分号\%,使其成为比较值的一部分。

          【讨论】:

          • 这仅在您使用LIKE 运算符的ESCAPE 选项时有效。没有默认转义字符(无论如何在 SQL Server 中)。
          【解决方案8】:

          这可能是一个帮助:)

          DECLARE @SearchCriteria VARCHAR(25)
          SET  @SearchCriteria = 'employee'
          IF CHARINDEX('%', @SearchCriteria) = 0
          BEGIN
          SET @SearchCriteria = '%' + @SearchCriteria + '%'
          END
          SELECT * 
          FROM Employee
          WHERE Name LIKE @SearchCriteria
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-10-09
            • 2013-05-27
            • 2023-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-18
            相关资源
            最近更新 更多