使用'%'的SQL 'LIKE'查询,其中搜索条件包含'%'。

41

我有一个如下的SQL查询。

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

如果search_criteria = 'abc',它将返回包含xxxabcxxxx的数据,这是可以接受的。

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

我该如何处理这种情况?


1
那为什么要加上你自己的%呢? - Randy
如何实现取决于您的引擎,但显然您必须转义自己的%。 - Sebas
你使用的编程语言是什么? - Jeshurun
使用MATCH代替LIKE。 - Hitendra Joshi
8个回答

36

如果您想要将search_criteria中的百分号%作为字面字符而不是通配符处理,请使用转义符[%]

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

1
谢谢,给出带有百分号的列 select * from tablename where Column like '%[%]%' - Shaiju T

15

使用转义语句:

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

结果

123abc%456
你可以将转义字符设置为任何你想要的字符。在这种情况下,默认为 '\ '。转义的 '\%' 变成了字面上的 '%', 第二个 '%' 没有被转义,因此又是通配符。
请参见SQL LIKE 子句特殊字符列表

12
最简单的解决方案是完全不使用"like":
Select * 
from table
where charindex(search_criteria, name) > 0

我更喜欢使用charindex而不是like。历史上,它的性能更好,但现在我不确定是否有太大的区别。


1
我非常喜欢这个答案,因为它显然不容易受到 SQL 注入攻击,你避免了字符串拼接。 - StuartQ
1
请查看SQL Server性能,了解一个非常简短的比较。请注意,如果存在索引,使用like 'findme%'仍然可以使用索引。 - Scotty.NET

6

要在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

2
你需要进行转义:在许多数据库中,这可以通过在百分号前加上反斜杠\%来完成。
所以abc变为abc\%
你的编程语言将有一个特定于数据库的函数来为你完成此操作。例如,PHP具有针对MySQL数据库的mysql_escape_string()函数。

2
Select * from table where name like search_criteria

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

0

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


只有在使用 LIKE 运算符的 ESCAPE 选项时才有效。在 SQL Server 中,没有默认的转义字符。 - David R Tribble

0

也许这个可以帮助你 :)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接