CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  数据库(包含打印,安装,报表)

like 模糊查询究竟怎么理解?

楼主tmran(Rocky 爱瘦鱼)2004-12-02 22:18:46 在 VB / 数据库(包含打印,安装,报表) 提问

如题。 问题点数:10、回复次数:6Top

1 楼aohan(aohan)回复于 2004-12-02 22:25:51 得分 10

就象DOS查询中的*,它是一个匹配符Top

2 楼aohan(aohan)回复于 2004-12-02 22:27:49 得分 0

说的不准确,以为是%号了,呵呵  
   
   
  LIKE  
  确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。与使用   =   和   !=   字符串比较运算符相比,使用通配符可使   LIKE   运算符更加灵活。如果任何参数都不属于字符串数据类型,Microsoft®   SQL   Server™   会将其转换成字符串数据类型(如果可能)。  
   
  语法  
  match_expression   [   NOT   ]   LIKE   pattern   [   ESCAPE   escape_character   ]  
   
  参数  
  match_expression  
   
  任何字符串数据类型的有效   SQL   Server   表达式。  
   
  pattern  
   
  match_expression   中的搜索模式,可以包含下列有效   SQL   Server   通配符。  
   
  通配符   描述   示例    
  %   包含零个或更多字符的任意字符串。   WHERE   title   LIKE   '%computer%'   将查找处于书名任意位置的包含单词   computer   的所有书名。    
  _(下划线)   任何单个字符。   WHERE   au_fname   LIKE   '_ean'   将查找以   ean   结尾的所有   4   个字母的名字(Dean、Sean   等)。    
  [   ]   指定范围   ([a-f])   或集合   ([abcdef])   中的任何单个字符。   WHERE   au_lname   LIKE   '[C-P]arsen'   将查找以arsen   结尾且以介于   C   与   P   之间的任何单个字符开始的作者姓氏,例如,Carsen、Larsen、Karsen   等。    
  [^]   不属于指定范围   ([a-f])   或集合   ([abcdef])   的任何单个字符。   WHERE   au_lname   LIKE   'de[^l]%'   将查找以   de   开始且其后的字母不为   l   的所有作者的姓氏。    
   
   
  escape_character  
   
  字符串数据类型分类中的所有数据类型的任何有效   SQL   Server   表达式。escape_character   没有默认值,且必须仅包含一个字符。  
   
  结果类型  
  Boolean  
   
  结果值  
  如果   match_expression   匹配指定模式,LIKE   将返回   TRUE。  
   
  注释  
  当使用   LIKE   进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比较要返回包含"abc   "(abc   后有一个空格)的所有行,则将不会返回包含"abc"(abc   后没有空格)的列所在行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc   后没有空格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。  
   
  由于数据存储方式的原因,使用包含   char   和   varchar   数据模式的字符串比较可能无法通过   LIKE   比较。了解每种数据类型的存储方式以及导致   LIKE   比较失败的原因十分重要。下面的示例将局部   char   变量传递给存储过程,然后使用模式匹配查找某个作者的所有著作。在此过程中,作者的姓将作为变量传递。  
   
  CREATE   PROCEDURE   find_books   @AU_LNAME   char(20)  
  AS  
  SELECT   @AU_LNAME   =   RTRIM(@AU_LNAME)   +   '%'  
  SELECT   t.title_id,   t.title    
  FROM   authors   a,   titleauthor   ta,   titles   t  
  WHERE   a.au_id   =   ta.au_id   AND   ta.title_id   =   t.title_id  
        AND   a.au_lname   LIKE   @AU_LNAME  
   
  当名字中包含的字符数小于   20   时,char   变量   (@AU_LNAME)   将包含尾随空格,这导致   find_books   过程中没有行返回。由于   au_lname   列为   varchar   类型,所以没有尾随空格。因为尾随空格是有意义的,所以此过程失败。    
   
  但下面的示例是成功的,因为尾随空格没有被添加到   varchar   变量中:  
   
  USE   pubs  
  GO  
  CREATE   PROCEDURE   find_books2   @au_lname   varchar(20)  
  AS  
  SELECT   t.title_id,   t.title    
  FROM   authors   a,   titleauthor   ta,   titles   t  
  WHERE   a.au_id   =   ta.au_id   AND   ta.title_id   =   t.title_id  
        AND   a.au_lname   LIKE   @au_lname   +   '%'  
   
  EXEC   find_books2   'ring'  
   
  下面是结果集:  
   
  title_id   title                                                                                                                                                          
  --------   ---------------------------------------------------------------  
  MC3021       The   Gourmet   Microwave                                                                                                                          
  PS2091       Is   Anger   the   Enemy?                                                                                                                              
  PS2091       Is   Anger   the   Enemy?                                                                                                                              
  PS2106       Life   Without   Fear                                                                                                                                  
   
  (4   row(s)   affected)  
   
  使用   LIKE   的模式匹配  
  当搜索   datetime   值时,推荐使用   LIKE,因为   datetime   项可能包含各种日期部分。例如,如果将值   19981231   9:20   插入到名为   arrival_time   的列中,则子句   WHERE   arrival_time   =   9:20   将无法找到   9:20   字符串的精确匹配,因为   SQL   Server   将其转换为   1900   年   1   月   1   日上午   9:20。然而,子句   WHERE   arrival_time   LIKE   '%9:20%'   将找到匹配。  
   
  LIKE   支持   ASCII   模式匹配和   Unicode   模式匹配。当所有参数,包括   match_expression、pattern   和   escape_character(如果有)都是   ASCII   字符数据类型时,将执行   ASCII   模式匹配。如果其中任何参数属于   Unicode   数据类型,则所有参数将被转换为   Unicode   并执行   Unicode   模式匹配。当对   Unicode   数据(nchar   或   nvarchar   数据类型)使用   LIKE   时,尾随空格是有意义的。但是对于非   Unicode   数据,尾随空格没有意义。Unicode   LIKE   与   SQL-92   标准兼容。ASCII   LIKE   与   SQL   Server   的早期版本兼容。  
   
  下面的一系列示例显示   ASCII   LIKE   模式匹配与   Unicode   LIKE   模式匹配所返回的行之间的差异:  
   
  --   ASCII   pattern   matching   with   char   column  
  CREATE   TABLE   t   (col1   char(30))  
  INSERT   INTO   t   VALUES   ('Robert   King')  
  SELECT   *    
  FROM   t    
  WHERE   col1   LIKE   '%   King'       --   returns   1   row  
   
  --   Unicode   pattern   matching   with   nchar   column  
  CREATE   TABLE   t   (col1   nchar(30))  
  INSERT   INTO   t   VALUES   ('Robert   King')  
  SELECT   *    
  FROM   t    
  WHERE   col1   LIKE   '%   King'       --   no   rows   returned  
   
  --   Unicode   pattern   matching   with   nchar   column   and   RTRIM  
  CREATE   TABLE   t   (col1   nchar   (30))  
  INSERT   INTO   t   VALUES   ('Robert   King')  
  SELECT   *    
  FROM   t    
  WHERE   RTRIM(col1)   LIKE   '%   King'       --   returns   1   row  
   
   
   
  说明     如果使用   LIKE   进行字符串比较,模式字符串中的所有字符都有意义,包括起始空格或尾随空格。  
   
   
  Top

3 楼aohan(aohan)回复于 2004-12-02 22:28:00 得分 0

使用   %   通配符  
  如果指定   LIKE   '5%',SQL   Server   将搜索后面带有零个或多个任意字符的数字   5。    
   
  例如,此查询将显示数据库中所有的系统表,因为它们都以字母   sys   开始:  
   
  SELECT   TABLE_NAME  
  FROM   INFORMATION_SCHEMA.TABLES  
  WHERE   TABLE_NAME   LIKE   'sys%'  
   
   
   
  说明     请注意:系统表可以随版本不同而更改。推荐使用信息架构视图或适用的存储过程处理   SQL   Server   系统表。  
   
   
  若要查阅非系统表的所有对象,请使用   NOT   LIKE   'sys%'。如果共有   32   个对象且   LIKE   找到   13   个与模式匹配的名称,则   NOT   LIKE   将找到   19   个与   LIKE   模式不匹配的对象。  
   
  使用   LIKE   '[^s][^y][^s]%'   模式不一定每次找到的名称都相同。可能仅得到   14   个名称(而不是   19   个),除了系统表名称外,所有以   s   开始或第二个字母为   y   或第三个字母为   s   的名称也都将从结果中消除。这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹配失败,那么就会将其消除。  
   
  将通配符作为文字使用  
  可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用   LIKE   关键字和   [   ]   通配符的示例。  
   
  符号   含义    
  LIKE   '5[%]'   5%    
  LIKE   '[_]n'   _n    
  LIKE   '[a-cdf]'   a、b、c、d   或   f    
  LIKE   '[-acdf]'   -、a、c、d   或   f    
  LIKE   '[   [   ]'   [    
  LIKE   ']'   ]    
  LIKE   'abc[_]d%'   abc_d   和   abc_de    
  LIKE   'abc[def]'   abcd、abce   和   abcf    
   
   
  使用   ESCAPE   子句的模式匹配  
  可搜索包含一个或多个特殊通配符的字符串。例如,customers   数据库中的   discounts   表可能存储含百分号   (%)   的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供   ESCAPE   关键字和转义符。例如,一个样本数据库包含名为   comment   的列,该列含文本   30%。若要搜索在   comment   列中的任何位置包含字符串   30%   的任何行,请指定由   WHERE   comment   LIKE   '%30!%%'   ESCAPE   '!'   组成的   WHERE   子句。如果不指定   ESCAPE   和转义符,SQL   Server   将返回所有含字符串   30   的行。  
   
  下例说明如何在   pubs   数据库   titles   表的   notes   列中搜索字符串"50%   off   when   100   or   more   copies   are   purchased":  
   
  USE   pubs  
  GO  
  SELECT   notes  
  FROM   titles  
  WHERE   notes   LIKE   '50%%   off   when   100   or   more   copies   are   purchased'    
        ESCAPE   '%'  
  GO  
   
  示例  
  A.   使用带   %   通配符的   LIKE  
  下例查找   authors   表中所有区号为   415   的电话号码。  
   
  USE   pubs  
  GO  
  SELECT   phone  
  FROM   authors  
  WHERE   phone   LIKE   '415%'  
  ORDER   by   au_lname  
  GO  
   
  下面是结果集:  
   
  phone                  
  ------------    
  415   658-9932    
  415   548-7723    
  415   836-7128    
  415   986-7020    
  415   836-7128    
  415   534-9219    
  415   585-4620    
  415   354-7128    
  415   834-2919    
  415   843-2991    
  415   935-4228    
   
  (11   row(s)   affected)  
   
  B.   使用带   %   通配符的   NOT   LIKE  
  下例查找   authors   表中所有区号不是   415   的电话号码。  
   
  USE   pubs  
  GO  
  SELECT   phone  
  FROM   authors  
  WHERE   phone   NOT   LIKE   '415%'  
  ORDER   BY   au_lname  
  GO  
   
  下面是结果集:  
   
  phone                  
  ------------    
  503   745-6402    
  219   547-9982    
  615   996-8275    
  615   297-2723    
  707   938-6445    
  707   448-4982    
  408   286-2428    
  301   946-8853    
  801   826-0752    
  801   826-0752    
  913   843-0462    
  408   496-7223    
   
  (12   row(s)   affected)  
   
  C.   使用   ESCAPE   子句  
  下例使用   ESCAPE   子句和转义符查找   mytbl2   表的   c1   列中的精确字符串   10-15%。  
   
  USE   pubs  
  GO  
  IF   EXISTS(SELECT   TABLE_NAME   FROM   INFORMATION_SCHEMA.TABLES  
              WHERE   TABLE_NAME   =   'mytbl2')  
        DROP   TABLE   mytbl2  
  GO  
  USE   pubs  
  GO  
  CREATE   TABLE   mytbl2  
  (  
    c1   sysname  
  )  
  GO  
  INSERT   mytbl2   VALUES   ('Discount   is   10-15%   off')  
  INSERT   mytbl2   VALUES   ('Discount   is   .10-.15   off')  
  GO  
  SELECT   c1    
  FROM   mytbl2  
  WHERE   c1   LIKE   '%10-15!%   off%'   ESCAPE   '!'  
  GO  
   
  D.   使用   [   ]   通配符  
  下例查找名字为   Cheryl   或   Sheryl   的作者。  
   
  USE   pubs  
  GO  
  SELECT   au_lname,   au_fname,   phone  
  FROM   authors  
  WHERE   au_fname   LIKE   '[CS]heryl'  
  ORDER   BY   au_lname   ASC,   au_fname   ASC  
  GO  
   
  下例查找姓为   Carson、Carsen、Karson   或   Karsen   的作者所在的行。  
   
  USE   pubs  
  GO  
  SELECT   au_lname,   au_fname,   phone  
  FROM   authors  
  WHERE   au_lname   LIKE   '[CK]ars[eo]n'  
  ORDER   BY   au_lname   ASC,   au_fname   ASC  
  GO  
   
   
   
  Top

4 楼tmran(Rocky 爱瘦鱼)回复于 2004-12-02 22:36:30 得分 0

我用的MDB数据库,查询有三种:like,>=,<=,这三种是不是用法不一样哦?用like时基本查不出东西来,>=,<=都正常的。  
  请赐教,谢谢!  
   
   
  初学者,不介意三Top

5 楼aohan(aohan)回复于 2004-12-02 23:09:51 得分 0

不知你用的是什么通配符  
  ACCESS中是这样的  
   
  在没有设置92兼容的情况下  
   
  select     *   from   table     where     fields   like   '*aaa'  
   
  就可以了  
   
   
  如果使用了92兼容标准,也能使用  
   
   
  select     *   from   table     where     fields     like     '%aaa'Top

6 楼tmran(Rocky 爱瘦鱼)回复于 2004-12-03 19:53:32 得分 0

谢谢,我搞定了,必须使用%才可以,不能用*,这个不知道为啥。Top

相关问题

  • 模糊查询
  • 模糊查询
  • 模糊查询问题
  • 模糊查询的问题
  • 怎样模糊查询?
  • 模糊查询怎么写?
  • 模糊查询问题
  • adodb 和模糊查询
  • 字段的模糊查询
  • 如何做模糊查询?

关键词

  • ps2
  • 字符
  • 模式
  • 数据
  • 查询
  • 字母
  • 字符串
  • 通配符
  • au
  • mytbl2

得分解答快速导航

  • 帖主:tmran
  • aohan

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo