啪!扔手机……书接上回……
1.
上节我们分享了Where子句的单条件和多条件查询,今天就把当时未讲的模糊匹配查询说一下。
我们知道,在Excel中有两个很重要的通配符:星号(*)和问号(?);在字符串中,星号可以代替0到多个字符,而问号(一个)则只能代表一个字符。在SQL in Excel中也有两个与之类似的通配符;一个是%,类似星号,可代替任意数量字符。一个是_,类似问号,一个_只能代替一个字符。
……在SQL查询语句中使用通配符,必须借助LIKE运算符。
举个例子,依然使用上一节的荔枝。
倘若我们需要获取姓名中包含“光”字的学生名单,SQL代码如下:
SELECT 姓名 FROM [学生表$] WHERE 姓名 LIKE '%光%'
倘若我们需要获取姓名长度为2个字符的学生名单,SQL代码如下:
SELECT 姓名 FROM [学生表$] WHERE 姓名 LIKE '__'
倘若我们需要获取姓名以“美女”开头(啧啧,好自恋的人啊,居然以美女为姓,此处必须手动@芬子@空空),同时年龄小于18岁的学生名单,SQL代码如下:
SELECT 姓名,年龄 FROM [学生表$] WHERE 姓名 LIKE '美女%' AND 年龄<>
……
当Excel单元格存在星号(*),而我们又需要批量查找或替换星号时,通常使用“~”进行强制转义。
那么在SQL中,又使用什么符号可以取消%和_的通配符能力,归为普通字符呢?
不知你是否还记得当字段名出现特殊字符(例如空格)时,我们是怎么处理的——使用中括号[]将字段名包括起来,这里同样如此。
还是举个栗子。
如上图所示,是一份名为学生表的Excel工作表,倘若我们需要查询“备注”字段包含特殊字符(_)的学生名单,代码如下:
SELECT 姓名,备注 FROM [学生表$] WHERE 备注 LIKE '%[_]%'
小贴士:
在SQL IN Excel中,不支持使用通配符*和?,只能使用通配符%和_,但在ACCESS数据库中,不支持使用通配符%和_,只支持*和?。
2.
举一个对新手而言可能稍微复杂的VBA+ADO+SQL的实例(示例文件可以点击文末的【阅读原文】下载)。
该实例在工作中是较为常见也较为实用的。
在一个工作簿里,有两个工作表,一个是学生表,一个是查询表。
上图是学生表,记录了学生信息的明细。
上图是查询表。第一行是标题栏,有四个字段名,分别是班级、姓名、性别、爱好。
要求:
在查询表字段名对应的第二行的单元格输入关键值后,点击【查询】按钮,从“学生表”获取符合查询条件的学生信息。
效果动画示意:
VBA代码如下:
Sub SqlFindData()
Dim cnn As Object, rst As Object
Dim Mypath As String, Str_cnn As String, Sql As String
Dim i As Long, j As Long
Set cnn = CreateObject('adodb.connection')
Mypath = ThisWorkbook.FullName
If Application.Version < 12="">
Str_cnn = 'Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=' & Mypath
Else
Str_cnn = 'Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=' & Mypath
End If
cnn.Open Str_cnn
'以上后期绑定ADO并建立当前文件链接
For j = 1 To 4
If Len(Cells(2, j).Value) Then
'当查询关键值不为空时,使用and运算符和like链接在一起
Sql = Sql & ' AND ' & Cells(1, j).Value & ' LIKE '%' & Cells(2, j).Value & '%''
End If
Next
If Len(Sql) = 0 Then MsgBox '尚未输入任一查询关键值。': Exit Sub
'当没有输入任何查询关键值时退出程序
Sql = 'SELECT * FROM [学生表$] WHERE ' & Mid(Sql, 5)
Set rst = cnn.Execute(Sql)
'cnn.Execute()执行SQL语句
ActiveSheet.UsedRange.Offset(3).ClearContents
For i = 0 To rst.Fields.Count - 1
'遍历记录集中的字段名
Cells(4, i + 1) = rst.Fields(i).Name
Next
Range('a5').CopyFromRecordset rst
'将记录复制到单元格区域
ActiveSheet.ListObjects.Add xlSrcRange, ActiveSheet.UsedRange.Offset(3), , xlYes
'数据区域转换为【表】
cnn.Close '关闭链接
Set cnn = Nothing '释放内存
End Sub
小贴士:
1.VBA+ADO方法执行SQL语句的最大优势之一便是VBA对象、变量和循环的使用,它们使SQL语句的组合非常灵活,可以极有层次感的表述复杂的SQL语句。上述示例中,通过遍历单元格对象A1:D2,搭配SQL查询语句中AND和LIKE运算符,用较少的VBA代码完成了多条件的模糊匹配查询,这比VBA自身的INSTR函数要高效的多。
2. 没有VBA基础的朋友可以对该实例先飘过。学一下常用的SQL查询语句,按第1章OLE DB法,结合透视表或表功能使用SQL语句,也是极其实用的。
握爪,致安,8~
大型Excel工具书《Excel 2016应用大全》
1. 全面:详尽而又系统地介绍Excel技术。
2. 实战:精选ExcelHome的海量案例,零距离接触Excel专家级使用方法。
3. 深入:对一些常常困扰学习者的功能深入揭示背后的原理,让读者知其然,还能知其所以然。
4. 揭秘:独家讲授Excel多项绝秘应用,披露来自Excel专家多年研究成果。
风的方向 2022-05-23
青菜萝卜 2022-07-24
韵竹 2021-01-24
叮当 2022-12-13
蛛蛛妹 2022-10-01
海哥 2019-06-05
穆德 2021-02-18
topphoenix 2021-01-25
犀牛望月 2020-01-08
我心飞翔 2022-12-13