VB6基本数据库应用(八):模糊搜索与基于范围的搜索

18 篇文章 2 订阅
11 篇文章 1 订阅

同系列的第八篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/48402885

VB6基本数据库应用(八):模糊搜索与基于范围的搜索

前面的几章讲解了搜索的许多复杂的用法。然而提供再多的条件,还是无法满足我们的需求。因为我们不一定能够获得一个精确的条件来对数据进行检索。所以如果能够提供模糊的匹配,能使我们的搜索更加容易。

 

不等条件

此前我们使用的条件都是用“=”来确定的,实际上对于数字类型(包括时间与日期)的数据,我们更多的是使用“>”(大于),“<”(小于),“>=”(大于等于),“<=”(小于等于),“<>”(不等于)。

例如我们可以按上一篇的方法,添加一个年龄Age字段,数据类型是数字;还有一个创建日期CreateDate字段,数据类型是日期与时间。如下图。


然后填写好数据,所需的数据如下,这一章的内容都使用这些数据。其中蓝色的数据是以前的。

 StudentID 

 StudentName 

PhoneNo

 Age 

 CreateDate 

123456 

 林则徐 

 13888080088 

21 

2015/9/25 

562893 

  叶剑英 

13920171101 

15 

2015/7/13 

662356 

 黄飞鸿 

13427103456 

18 

2015/9/4 

785714 

 黄飞鸿 

13978569013 

12 

2015/9/7 

736375 

霍金 

13739475815 

23 

2015/8/13 

284626 

乔布斯 

18382195632 

 22 

2015/6/19 

563992 

陆逊 

13795720163 

19 

2015/8/21 

318264 

乔森 

15843956272 

13 

2015/5/30 

248369 

欧阳峰 

19472747288 

16 

2015/7/16 

473610 

爱因斯坦 

13329177473 

25 

2015/9/4 

现在,我们可以来查找年龄大于等于18岁的,就可以用如下的语句:

SELECT * FROM Student WHERE Age>=18

结果是显而易见的。SQL语句的运行结果如下


其他比较符的用法也是一样的。而且还可以与上一章所说的关系连接词一同使用。

例如:要查询15岁(包括)到21岁(包括)之间的人,SQL可以这样写:

SELECT * FROM Student WHERE Age>=15 AND Age<21

查询结果如下:



基于范围的搜索(1)

上面要查询查询15岁(包括)到21岁(不包括)之间的人,如果两个数值都是包括的,我们就可以使用BETWEEN…AND语句来实现。其基本语法是

SELECT* FROM Student WHERE 字段名 BETWEEN 数值1  AND 数值2

BETWEEN…AND语句相当于是下面的语句:

SELECT* FROM Student WHERE 字段名>=数值1  AND  字段名<=数值2


我们还可以在BETWEEN前面加NOT,来表示不在此范围内。必须注意的是,加了NOT之后,两个数值都是不包括的。如果加了NOT,就相当于下面的语句:

SELECT* FROM Student WHERE 字段名<数值1  AND  字段名>数值2


可以写一下NOT的语句检验一下。如下:

SELECT * FROM Student WHERE Age NOT BETWEEN 15 AND 21

结果如下图所示,可以发现15和21的都没有出现在结果当中。而没有NOT的情况则交给读者自己去验证了。


基于范围的搜索(2)

多个OR逻辑连接词连接起来的条件可以用更简单的方法来表示。现在先来温习一下OR逻辑连接词。例如现在需要电话号码是19472747288(欧阳锋),或15843956272(乔森),或17639284669,或18856350376的人。后面专门加了2个数据中没有对应的人的电话。现在来看一下用OR逻辑连接词如何书写SQL语句:

SELECT * FROM Student WHERE PhoneNo=19472747288 OR PhoneNo =15843956272 OR PhoneNo=17639284669 OR PhoneNo=18856350376

语句执行的结果当然是欧阳锋和乔森这两个人的记录显示出来。然而,这样的SQL语句非常冗长,PhoneNo重复出现好多次,看起来也不好看。所以我们可以使用IN语句来实现。

 

IN语句的基本语法是:

SELECT* FROM Student WHERE 字段名 IN(值1,值2,值3……)

这个语法的值1,值2……不要求是数值,BETWEEN…AND之所以强调是数值,是因为只有数值才有大小的比较,但是IN代表的是字段的数据与值1,或值2,或值3……相等,所以既然是相等的话,任何数据都是可以的。

(值1,值2,值3)构成了一个范围,与BETWEEN…AND语句不同的是,这个范围不是连续的,而是分立的。所以,上面用OR连接词书写的语句就可以写成:

SELECT * FROM Student WHERE PhoneNo IN(19472747288,15843956272,17639284669,8856350376)

 

当前的代码显得更加清晰,写起来也不那么麻烦了。正如我所给出的四个电话号码中,最后的两个是数据中没有对应的人的电话号码,既然是搜索就存在搜索不到的问题,所以这个范围不一定全都是有效的(在数据中存在的)值,也就是说当前的记录中不会有任何记录的电话号码匹配最后这两个值。

 

模糊搜索

这里的模糊搜索,准确的称呼应该是模式匹配。实际上很多人都在其他的软件中使用过这样的搜索。例如,我们要找出全部姓“黄”的人。这样的需要是常有的。在SQL中可以用LIKE关键字提出一个模糊搜索。基本的语法如下:

SELECT* FROM Student WHERE 字段名 LIKE ‘匹配字符串’

与此前的语法不同,匹配字符串中并没有给出完整的搜索条件,而是使用通配符代替了不确定的部分。例如找出全部姓“黄”的人,SQL语句如下:

SELECT * FROM Student WHERE 字段名 LIKE ‘黄*’

注意模糊搜索单引号是必须的!而上面的语句中“*”就是通配符,表示任意个字符。所以’黄*’这个匹配字符串的意思是开头第一个字是黄,后面有多少个字,是什么字都随便。

支持的通配符如下[1]:

 匹配类型 

 模式

 匹配举例(返回 True)

 不匹配举例

(返回 False)

 多个字符 

 a*a

 aa、aBa 和 aBBBa

 aBC

 

 *ab*

 abc、AABB 和 Xab

 aZb 和 bac

  

 ab*

 abcdefg 和 abc

 cab 和 aab

 特殊字符

 a[*]a

 a*a

 aaa

 单个字符 

 a?a

 aaa、a3a 和 aBa

 aBBBa

 单个数字 

 a#a

 a0a、a1a 和 a2a

 aaa 和 a10a

 字符范围 

 [a-z]

 f、p 和 j

 2 和 &

 范围之外 

 [!a-z]

 9、& 和 %

 b 和 a

 数字值 

 [0-9]

 0, 1, 9

 A、a、& 和 ~

 非数字值 

 [!0-9]

 A、a、& 和 ~

 0, 1, 9

 复合值 

 a[!b-m]# 

 An9、az0 和 a99

 abc 和 aj0

这里解释一下最后的复合值。第一个字符是a,固定的。但是可以发现,在匹配举例的第一个An9,字母“a”是大写的,这证明LIKE是不识别大小写的,大小写按照同一个字符识别。然后[!b-m]是指不在b到m(即不是b、c、d、e、f、g、h、i、j、k、l、m)这12个字母的其他字符。需要注意的是a99也是匹配的,那就意味着不在b-m里指的是除了那12个字母之外的一切符号都是成立的,不仅限于字母。最后的#是一位的数字。

 

再举个例子,我们要寻找StudentID尾数是25,26的两个人(在数据中确实存在),可以这样写SQL语句:

SELECT * FROM Student WHERE StudentID LIKE '####25' OR StudentID LIKE '####26'

两个匹配字符串的前四位都是#,表示前4个数字(目前的StudentID共6位)任意,然后后面给出来的25,26就是确定的。

搜索结果如下图所示:

这一节,先不给出代码,也先不用在VB运行,直接在Access执行SQL语句观察效果即可。随着字段的增多,光使用ListBox已经不能满足我们的需要。在第九章,我将会讲述控件与数据库绑定,届时,我们将可以用表格控件完整呈现所有数据。同时还可以让ListBox自己更新数据库中的某个字段的内容,而不是使用ListBox的AddItem方法将Select返回的数据逐个添加到ListBox中。

 

在此布置一项作业吧。将上面的语句改成这样

SELECT* FROM Student WHERE StudentID LIKE '###25' OR StudentID LIKE '####26'。

25前面只有3个“#”,看看运行之后的结果是怎么样的。

 

参考文献:

[1] https://msdn.microsoft.com/zh-cn/library/office/ff195752(v=office.15).aspx


  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
4.13.0.130¶ 修改过滤器的默认配置,去掉了 encoding="gb2312" 4.13.0.129¶ 补充翻译了一条漏掉的快捷菜单项"显示搜索对话框(D)" 4.13.0.128¶ 增加了对英文的支持 4.12.0.127¶ 更新了热键控件,重新编译插件 4.11.0.126¶ 为了避免安装路径的差异问题,修改了make.bat,从注册表中提取VB6的路径 将热键设定及响应的功能提取到一个单独的HotkeyControl?项目中 引用新HotkeyControl?控件,并在本地添加一个代理类HotkeyProxy? 补充了类注释和模块注释 调整了检查版本的方式,增加对以何种方式检查的判断,在手动检查更新时忽略灵敏度设置 4.10.0.125¶ 增加自动升级灵敏度的设定 修改了没有激活工程时进行范围是当前工程的搜索提示错误的问题 4.9.0.124¶ 增加ICondInfo接口,此接口定义了需要使用的搜索条件,全局设定GlobalSetting?和条件快照ConditionSnap?都实现了该接口,此接口在TaskMgr?中用到,代替原先的大量Property Get语句 在搜索范围是当前工程的时候显示工程名称 修改了搜索范围是选定区域,且区域中包含汉字时会搜索不全的问题 修改了搜索范围是当前过程,过程为最后一行且无后续换行时,搜索不全的问题 4.8.0.123¶ 选中正则表达式时,将整词匹配选项替换为单行模式选项 增加对正则表达式单行模式搜索/替换的支持 尝试不关闭窗口的代码高亮方式 选中多行时自动将搜索范围切换至选中内容 在卸载插件时删除全局对象的引用 完美解决了定位时焦点显示的问题. 修改了VBA插件启动时提示下标越界的问题 更改了工程文件名和DLL文件名,去掉了开头的VB字母 修改了安装文件的文件名为VBEnhancedSearch_Setup.exe 代码预览的相关行数默认值修改为12 增加定位时将代码窗体最大化的选项 在搜索结果列表的右键菜单中,增加关闭全部页面的选项 修改了代码预览窗体的背景及关键字的颜色 4.7.0.120¶ 修改了点击关闭按钮关闭页面时出错的问题 修改了快速点击搜索按钮提示错误的问题 修改无页面时点击ESC提示错误的问题 修改无页面时未禁用关闭按钮的问题 修改vbalTabControl,在用BarEnabled?设置Enabled属性的时候同时设定CanClose?,防止用户在禁用时点击关闭按钮. 在弹出对话框之前进行菜单的状态更新操作,防止菜单项选中状态更新不及时. 为了提高效率,使用ByRef?传递使用频率较高函数的字符串参数 对齐升级提示对话框中的版本号 补充了一些注释 去掉了默认标签页 增加关闭其它页面的功能 将TabData?更名为Page 将LogClassInitialize?和LogClassTerminate?函数放入标准模块 增加ILib接口,此接口用于进行全局对象的构建和销毁,并修改所有本地全局对象的初始化机制. 为了提高执行效率,修改了vbalDTab6FES.ocx的源代码,增加可以快速批量设置所有Tab标签的可用属性BarEnabled? 从PageManager?分离出PageCollection?类,此类用于专门管理页面集合 修改了工具栏窗口创建的方式,将此操作合并到CreateObjects?函数中 点确定关闭选项窗口时如果过滤器字符串无变化,则不更新列表 修改滚动条重绘的方式为PostMessage? 修改了Tab控件的事件处理,结果窗口仅处理菜单相关事件,页面增减相关事件由PageManager?类处理 修改了分离PageCollection?类后需要调整的相关调用代码 对于Task对象的事件源更新操作都放在TabManager?类的TabChange?事件中
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值