<script type="text/javascript"> 
  </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

like

确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。与使用=和!=字符串比较运算符相比,使用通配符可使like运算符更加灵活。如果任何参数都不属于字符串数据类型,Microsoft®™会将其转换成字符串数据类型(如果可能)。

语法

match_expression[NOT]likepattern[ESCAPEescape_character]

参数

match_expression


任何字符串 数据类型的有效

sqlServer表达式。


pattern


match_expression中的搜索模式,可以包含下列有效

sqlServer通配符。


通配符 描述 示例

escape_character


字符串 数据类型分类中的所有

数据类型的任何有效

sqlServer表达式。

escape_character没有默认值,且必须仅包含一个字符。


结果类型

Boolean

结果值

如果match_expression匹配指定模式,like将返回TRUE。

注释

当使用like进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比较要返回包含"abc"(abc后有一个空格)的所有行,则将不会返回包含"abc"(abc后没有空格)的列所在行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc后没有空格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。

由于数据存储方式的原因,使用包含charvarchar数据模式的字符串比较可能无法通过like比较。了解每种数据类型的存储方式以及导致like比较失败的原因十分重要。下面的示例将局部char变量传递给存储过程,然后使用模式匹配查找某个作者的所有著作。在此过程中,作者的姓将作为变量传递。



CREATEPROCEDUREfind_books@AU_LNAMEchar(20)ASSELECT@AU_LNAME=RTRIM(@AU_LNAME)+'%'SELECTt.title_id,t.titleFROMauthorsa,titleauthorta,titlestWHEREa.au_id=ta.au_idANDta.title_id=t.title_idANDa.au_lnamelike@AU_LNAME



当名字中包含的字符数小于20时,char变量(@AU_LNAME)将包含尾随空格,这导致find_books过程中没有行返回。由于au_lname列为varchar类型,所以没有尾随空格。因为尾随空格是有意义的,所以此过程失败。

但下面的示例是成功的,因为尾随空格没有被添加到varchar变量中:



USEpubsGOCREATEPROCEDUREfind_books2@au_lnamevarchar(20)ASSELECTt.title_id,t.titleFROMauthorsa,titleauthorta,titlestWHEREa.au_id=ta.au_idANDta.title_id=t.title_idANDa.au_lnamelike@au_lname+'%'EXECfind_books2'ring'



下面是结果集:



title_idtitle-----------------------------------------------------------------------MC3021TheGourmetMicrowavePS2091IsAngertheEnemy?PS2091IsAngertheEnemy?PS2106LifeWithoutFear(4row(s)affected)



使用like的模式匹配

当搜索datetime值时,推荐使用like,因为datetime项可能包含各种日期部分。例如,如果将值199812319:20插入到名为arrival_time的列中,则子句WHEREarrival_time=9:20将无法找到9:20字符串的精确匹配,因为sqlServer将其转换为1900年1月1日上午9:20。然而,子句WHEREarrival_timelike'%9:20%'将找到匹配。

like支持ASCII模式匹配和Unicode模式匹配。当所有参数,包括match_expressionpatternescape_character(如果有)都是ASCII字符数据类型时,将执行ASCII模式匹配。如果其中任何参数属于Unicode数据类型,则所有参数将被转换为Unicode并执行Unicode模式匹配。当对Unicode数据ncharnvarchar数据类型)使用like时,尾随空格是有意义的。但是对于非Unicode数据,尾随空格没有意义。Unicodelikesql-92标准兼容。ASCIIlikesqlServer的早期版本兼容。

下面的一系列示例显示ASCIIlike模式匹配与Unicodelike模式匹配所返回的行之间的差异:



--ASCIIpatternmatchingwithcharcolumnCREATETABLEt(col1char(30))INSERTINTOtVALUES('RobertKing')SELECT*FROMtWHEREcol1like'%King'--returns1row--UnicodepatternmatchingwithncharcolumnCREATETABLEt(col1nchar(30))INSERTINTOtVALUES('RobertKing')SELECT*FROMtWHEREcol1like'%King'--norowsreturned--UnicodepatternmatchingwithncharcolumnandRTRIMCREATETABLEt(col1nchar(30))INSERTINTOtVALUES('RobertKing')SELECT*FROMtWHERERTRIM(col1)like'%King'--returns1row


说明  如果使用

like进行字符串比较,模式字符串中的所有字符都有意义,包括起始空格或尾随空格。


使用%通配符

如果指定like'5%',sqlServer将搜索后面带有零个或多个任意字符的数字5。

例如,此查询将显示中所有的系统表,因为它们都以字母sys开始:



SELECTTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWHERETABLE_NAMElike'sys%'


说明  请注意:系统表可以随版本不同而更改。推荐使用信息架构视图或适用的存储过程处理

sqlServer系统表。


若要查阅非系统表的所有对象,请使用NOTlike'sys%'。如果共有32个对象且like找到13个与模式匹配的名称,则NOTlike将找到19个与like模式不匹配的对象。

使用like'[^s][^y][^s]%'模式不一定每次找到的名称都相同。可能仅得到14个名称(而不是19个),除了系统表名称外,所有以s开始或第二个字母为y或第三个字母为s的名称也都将从结果中消除。这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹配失败,那么就会将其消除。

将通配符作为文字使用

可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用like关键字和[]通配符的示例。


符号 含义

使用ESCAPE子句的模式匹配

可搜索包含一个或多个特殊通配符的字符串。例如,customers数据库中的discounts表可能存储含百分号(%)的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供ESCAPE关键字和转义符。例如,一个样本数据库包含名为comment的列,该列含文本30%。若要搜索在comment列中的任何位置包含字符串30%的任何行,请指定由WHEREcommentlike'0!%%'ESCAPE'!'组成的WHERE子句。如果不指定ESCAPE和转义符,sqlServer将返回所有含字符串30的行。

下例说明如何在pubs数据titles表的notes列中搜索字符串"50%offwhen100ormorecopiesarepurchased":



USEpubsGOSELECTnotesFROMtitlesWHEREnoteslike'50%%offwhen100ormorecopiesarepurchased'ESCAPE'%'GO



示例
A.使用带%通配符的like

下例查找authors表中所有区号为415的电话号码。



USEpubsGOSELECTphoneFROMauthorsWHEREphonelike'415%'ORDERbyau_lnameGO



下面是结果集:



phone------------415658-9932415548-7723415836-7128415986-7020415836-7128415534-9219415585-4620415354-7128415834-2919415843-2991415935-4228(11row(s)affected)



B.使用带%通配符的NOTlike

下例查找authors表中所有区号不是415的电话号码。



USEpubsGOSELECTphoneFROMauthorsWHEREphoneNOTlike'415%'ORDERBYau_lnameGO



下面是结果集:



phone------------503745-6402219547-9982615996-8275615297-2723707938-6445707448-4982408286-2428301946-8853801826-0752801826-0752913843-0462408496-7223(12row(s)affected)


C.使用ESCAPE子句

下例使用ESCAPE子句和转义符查找mytbl2表的c1列中的精确字符串10-15%。



USEpubsGOIFEXISTS(SELECTTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWHERETABLE_NAME='mytbl2')DROPTABLEmytbl2GOUSEpubsGOCREATETABLEmytbl2(c1sysname)GOINSERTmytbl2VALUES('Discountis10-15%off')INSERTmytbl2VALUES('Discountis.10-.15off')GOSELECTc1FROMmytbl2WHEREc1like'-15!%off%'ESCAPE'!'GO



D.使用[]通配符

下例查找名字为Cheryl或Sheryl的作者。



USEpubsGOSELECTau_lname,au_fname,phoneFROMauthorsWHEREau_fnamelike'[CS]heryl'ORDERBYau_lnameASC,au_fnameASCGO



下例查找姓为Carson、Carsen、Karson或Karsen的作者所在的行。


USEpubsGOSELECTau_lname,au_fname,phoneFROMauthorsWHEREau_lnamelike'[CK]ars[eo]n'ORDERBYau_lnameASC,au_fnameASCGO



请参见

表达式

函数

SELECT
WHERE
 <script type="text/javascript"> 
               </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 
              

                <script type="text/javascript"> 
                </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>