啪!扔手机……书接上回……
▎ 两个通配符
上节我们分享了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 年龄<18
……
在Excel中,单元格存在星号(*),而又需要批量查找或替换星号时,通常使用“~”进行强制转义。
那么在SQL中,又使用什么符号可以取消%和_的通配符能力,使它转义为普通字符呢?
不知你是否还记得当字段名出现特殊字符(例如空格)时,我们是怎么处理的?
——使用中括号[]将字段名包括起来~打个响指,这里同样如此。
还是举个栗子。
如上图所示,是一份名为学生表的Excel工作表,倘若我们需要查询“备注”字段包含特殊字符(_)的学生名单,代码如下:
SELECT 姓名,备注
FROM [学生表$]
WHERE 备注 LIKE '%[_]%'
小贴士:
在SQL IN Excel中,不支持使用通配符*和?,只能使用通配符%和_,但在ACCESS数据库中,不支持使用通配符%和_,只支持*和?。
▎ 一个动态筛选数据的案例
举一个对新手而言可能稍微复杂的VBA+ADO+SQL的实例(示例文件文末可下载)。
该实例在工作中是较为常见也较为实用的。
在一个工作簿里,有两个工作表,一个是学生表,一个是查询表。
上图是学生表,记录了学生信息的明细。
下图是查询表。第一行是标题栏,有四个字段名,分别是班级、姓名、性别、爱好。
要求:
在查询表字段名对应的第二行的单元格输入关键值后,点击【查询】按钮,从“学生表”获取符合查询条件的学生信息。
效果动画示意:
VBA代码如下:
Sub Sql_QueryDataWithKeyword()
Dim adoConn As Object, rst As Object
Dim strPath As String, strConn As String, strSQL As String
Dim i As Long, j As Long
Set adoConn = CreateObject("adodb.connection")
strPath = ThisWorkbook.FullName
If Application.Version < 12 Then
strConn = "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & strPath
Else
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & strPath
End If
adoConn.Open strConn '以上后期绑定ADO并建立当前文件链接
For j = 1 To 4
If Len(Cells(2, j).Value) Then '当查询关键值不为空时,使用and运算符和like链接在一起
strSQL = strSQL & " AND " & Cells(1, j).Value & " LIKE '%" & Cells(2, j).Value & "%'"
End If
Next
If Len(strSQL) = 0 Then
MsgBox "尚未输入任一查询关键值。"
Exit Sub '当没有输入任何查询关键值时退出程序
End If
strSQL = "SELECT * FROM [学生表$] WHERE " & Mid(strSQL, 5)
Set rst = adoConn.Execute(strSQL) '执行strSQL语句
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 '将记录复制到单元格区域
adoConn.Close '关闭链接
Set adoConn = Nothing '释放内存
Set rst = Nothing
End Sub
小贴士:
VBA+ADO方法执行SQL语句的最大优势之一,是各种变量和循环语句的组合使用。它们使SQL语句的搭建更加灵活,可以比较有层次的表述复杂的SQL语句。
在上述示例中,通过遍历单元格对象A1:D2,搭配SQL查询语句中的AND和LIKE运算符,用较少的VBA代码完成了多条件的模糊匹配查询,这远比VBA自身的INSTR函数更简洁也更高效。
示例文件下载,百度网盘▼
https://pan.baidu.com/s/1I8WZGk4k61XkB2J_Wpz9Vg
提取码: nvem
⏩需要系统学习Excel却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?
加入我的付费社群,学习+训练+答疑,与6000+在线会员一起,同微软最有价值专家MVP同行,全面精进Excel之道
🚂>>~
加入我的付费会员,全面学习Excel
透视表 函数 图表 VBA PQ想学啥学啥
👀