【问题标题】:How do I find ' % ' with the LIKE operator in SQL Server? [duplicate]如何在 SQL Server 中使用 LIKE 运算符找到“%”? [复制]
【发布时间】:2013-09-12 15:41:28
【问题描述】:

我有一个列名地址,它由一些地址组成,中间有“%”:

Address
--------------------
Aman Ja%lan%
Stree% Ro%ad

等等等等

如何编写 LIKE 运算符来找到该模式?

我试过了:

declare @var char(1)
set @var='!%'
select Address from Accomodation where Address like '%'+@var+'%'

【问题讨论】:

    标签: sql-server tsql sql-like


    【解决方案1】:

    我会用

    WHERE columnName LIKE '%[%]%'
    

    SQL Server 存储字符串摘要统计信息,用于估计与LIKE 子句匹配的行数。当使用方括号语法时,基数估计会更好,并导致更合适的计划。

    this Connect Item 状态的回复

    我们不支持精确的基数估计 存在用户定义的转义字符。所以我们可能会得到一个穷人 估计和一个糟糕的计划。我们将考虑在一个 未来版本。

    一个例子

    CREATE TABLE T
    (
    X VARCHAR(50),
    Y CHAR(2000) NULL
    )
    
    CREATE NONCLUSTERED INDEX IX ON T(X)
    
    INSERT INTO T (X)
    SELECT TOP (5) '10% off'
    FROM master..spt_values
    UNION ALL
    SELECT  TOP (100000)  'blah'
    FROM master..spt_values v1,  master..spt_values v2
    
    
    SET STATISTICS IO ON;
    SELECT *
    FROM T 
    WHERE X LIKE '%[%]%'
    
    SELECT *
    FROM T
    WHERE X LIKE '%\%%' ESCAPE '\'
    

    显示第一个查询的 457 个逻辑读取和第二个查询的 33,335 个。

    【讨论】:

    • 确实是马丁,非常清晰的解释,但是当一个人必须搜索']'的情况下呢?例如INSERT INTO T (X) SELECT TOP (5) '10[] off' FROM master..spt_values
    • 确实是马丁,非常清晰的解释,但是当一个人必须搜索']'的情况下呢?例如INSERT INTO T (X) SELECT TOP (5) '10[] off' FROM master..spt_values为此,当我尝试使用[]搜索时,它没有出现SET STATISTICS IO ON; SELECT * FROM T WHERE X LIKE '%[]]%'但它与下面的SELECT * FROM T WHERE X LIKE '%\]%' ESCAPE '\'一起工作
    • @TejuMB - 这不需要转义。只需使用 LIKE '%]%'。如果您执行LIKE '%[AB]]%',则意味着匹配集合A,B 中的一个字符,然后是]。如果您选择LIKE '%[A]]%',则表示匹配A]。如果你做LIKE '%[]]%',那么它的意思是“匹配这个空字符集中的单个字符,然后是]。由于集合是空的,所以没有字符可以匹配。
    【解决方案2】:

    你可以使用ESCAPE:

    WHERE columnName LIKE '%\%%' ESCAPE '\'
    

    【讨论】:

    • 谢谢,实际上我删除了 ESCAPE,因为我认为它可能供我参考。
    • 使用 LIKE '%[%]%' 也应该是制作技巧。
    • @491243 实际上,这是一个很好的观点。您不能像这样 '[]]' 转义 ']',但您可以使用 ESCAPE 关键字和转义字符对其进行转义。为此+1,遗憾的是PATHINDEX也没有ESCAPE关键字。
    • @gotqn - 你为什么说你不能那样逃避它? SELECT 1 WHERE 'A[B' LIKE 'A[[]B' 工作正常。正如我的回答所示,使用ESCAPE 会给出更糟糕的计划。
    • @MartinSmith 你是对的。我是想说你不能转义“关闭”括号,但它似乎不是特殊符号,不需要转义。
    【解决方案3】:

    试试这个:

    declare @var char(3)
    set @var='[%]'
    select Address from Accomodation where Address like '%'+@var+'%' 
    

    你必须用[]取消通配符的作用,所以你把%读成一个普通字符,同上字符_

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 2013-01-19
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多