每当我编写一个基于字符串变量(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然后“=”。再次感谢您的意见。
答案 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)
是的,据我所知,使用没有任何通配符的方法与使用=运算符相同。你确定输入参数中没有通配符吗?