当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《与使用SQLServer匹配字符串的"="相似》经验,为你挑选了2个好方法。

每当我编写一个存储过程来根据字符串变量(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)

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

编辑

谢谢你的回答.

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



1> Aheho..:

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



2> Sam Saffron..:

阳光几乎搞定了:)

在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 cast技巧不容易出错并且更容易记忆.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有