与使用SQL Server匹配字符串的“=”相似

时间:2008-11-19 16:13:14

标签: sql sql-server like-keyword

每当我编写一个基于字符串变量(varchar,nvarchar,char)选择数据的存储过程时,我会有类似的东西:

procedure dbo.p_get_user_by_username(
    @username      nvarchar(256)
as
begin
    select
        u.username
        ,u.email
        --,etc
    from
        sampleUserTable u
    where
        u.username = @username
end

所以换句话说就是匹配我所拥有的记录

u.username = @username

但有时我遇到的代码会使用 LIK E 代替 = < /强>

u.username like(@username)

你什么时候使用它? 不应该仅在需要一些通配符匹配时才使用它吗?

修改

感谢您的回答。

我认为我需要澄清一下,我真正想要问的是:如果可能存在这样的情况,那么首选使用“=”代替精确的字符串匹配。从答案我可以说不会有。 根据我自己的经验,即使在我需要忽略的情况下,例如前导和结束空格,我会在两个字符串上使用ltrim,rtrim,lower然后“=”。再次感谢您的意见。

9 个答案:

答案 0 :(得分:13)

你是对的。除非您正在进行外卡匹配,否则使用LIKE没有任何好处。此外,使用不带通配符可能导致使用效率低下的查询计划。

答案 1 :(得分:7)

Sunny差点儿做对了:)

在SQLA5的默认安装中在QA中运行以下内容

select * from sysobjects where name = 'sysbinobjs   '
-- returns 1 row
select * from sysobjects where name like 'sysbinobjs   '
-- returns 0 rows

因此,LIKE在尾随空格上不匹配,在查询计划方面几乎都表现相同,但'='连接执行得更好。

使用LIKE时必须记住的另一件事是正确地转义字符串。

declare @s varchar(40) 
set @s = 'escaped[_]_%'

select 1 where 'escaped[_]_%'  like @s 
--Return nothing = BAD 

set @s = '_e_s_c_a_p_e_d_[___]___%' 

select 1 where 'escaped[_]_%'  like @s escape '_'
--Returns 1 = GOOD

一般来说,人们不会使用LIKE进行精确匹配,因为逃避问题会导致各种各样的并发症和微妙的错误,人们会忘记逃避并且有一个痛苦的世界。

但是......如果你想要一个有效的真正完全匹配,LIKE可以解决问题。

说,您想要将用户名与“sam”匹配,并且不希望获得“Sam”或“Sam”,不幸的是列的排序规则不区分大小写。

如下所示(添加了转义)是要走的路。

select * from sysobjects
WHERE name = 'sysbinobjs' and name COLLATE Latin1_General_BIN LIKE 'sysbinobjs'

进行双重匹配的原因是避免表扫描。

然而......

我认为varbinary casting trick不容易出错并且更容易记住。

答案 2 :(得分:3)

如果没有使用通配符,则区别在于“=”与完全匹配,但LIKE将匹配带尾随空格的字符串(来自SSBO):

  

执行字符串比较时   与LIKE,所有人物   模式字符串很重要,   包括前导或尾随空格。   如果查询中的比较是   使用字符串LIKE返回所有行   'abc'(abc后跟一个   空格),其中一行的值   该列是abc(abc没有   空间)不归还。然而,   尾随空白,在表达中   哪个模式匹配,是   忽略。如果查询中的比较是   返回包含字符串的所有行   所有人都喜欢'abc'(abc没有空格)   以abc开头并且为零的行   或者更多的尾随空白。

答案 3 :(得分:2)

使用LIKE关键字,您可以将字段u.username与指定的模式匹配,而不是固定的“字符串”。

答案 4 :(得分:2)

如果你在其他人的代码中看到这个,也许他们打算允许一个人传入包含模式或通配符的字符串。

答案 5 :(得分:1)

是 - 你是对的 - 它应该只用于通配符匹配。它应该谨慎使用,特别是在非索引字段的非常大的表上,因为它会减慢你的查询WAY WAY down。

答案 6 :(得分:1)

我遇到了同样的问题。用=运行类似查询花了大约一分半钟。当我将=更改为like时,查询速度要快得多。

  • 尝试为要比较的列创建索引。这显着加快了查询速度。
  • 尝试运行sp_updatestats。在我的例子中,这使得查询在使用=时大约6秒内运行而没有索引,几乎立即使用索引。

答案 7 :(得分:0)

LIKE用于通配符匹配,其中as =(equals)用于完全匹配。

我还认为它用于已经由FULL TEXT CATALOGS编目进行硬核字符串比较的字段。

答案 8 :(得分:-1)

是的,据我所知,使用没有任何通配符的方法与使用=运算符相同。你确定输入参数中没有通配符吗?