如何在MS Access中通过查询查找字符串首个数字位置并提取数字
MS Access查询提取文本中数字的解决方案
错误原因
你之前的写法失效是因为InStr函数不支持通配符匹配,你传入的"*[0-9]*"会被识别为普通字符串进行匹配,自然找不到对应数字的位置。
实现方案
不需要使用VBA,直接通过查询嵌套表达式实现,26000条数据执行无性能压力,且适配你提到的数字最多两位的场景。
分步写法(可读性更高)
在查询设计器中新增两个计算字段:
- 计算第一个数字出现的位置,可根据你的文本前缀实际长度调整嵌套层数,以下示例覆盖前20位:
Pos: IIf(Mid([txtPMTaskDesc],1,1) Like "[0-9]",1, IIf(Mid([txtPMTaskDesc],2,1) Like "[0-9]",2, IIf(Mid([txtPMTaskDesc],3,1) Like "[0-9]",3, IIf(Mid([txtPMTaskDesc],4,1) Like "[0-9]",4, IIf(Mid([txtPMTaskDesc],5,1) Like "[0-9]",5, IIf(Mid([txtPMTaskDesc],6,1) Like "[0-9]",6, IIf(Mid([txtPMTaskDesc],7,1) Like "[0-9]",7, IIf(Mid([txtPMTaskDesc],8,1) Like "[0-9]",8, IIf(Mid([txtPMTaskDesc],9,1) Like "[0-9]",9, IIf(Mid([txtPMTaskDesc],10,1) Like "[0-9]",10, IIf(Mid([txtPMTaskDesc],11,1) Like "[0-9]",11, IIf(Mid([txtPMTaskDesc],12,1) Like "[0-9]",12, IIf(Mid([txtPMTaskDesc],13,1) Like "[0-9]",13, IIf(Mid([txtPMTaskDesc],14,1) Like "[0-9]",14, IIf(Mid([txtPMTaskDesc],15,1) Like "[0-9]",15, IIf(Mid([txtPMTaskDesc],16,1) Like "[0-9]",16, IIf(Mid([txtPMTaskDesc],17,1) Like "[0-9]",17, IIf(Mid([txtPMTaskDesc],18,1) Like "[0-9]",18, IIf(Mid([txtPMTaskDesc],19,1) Like "[0-9]",19, IIf(Mid([txtPMTaskDesc],20,1) Like "[0-9]",20,0))))))))))))))))))
- 提取数字并转为数值类型,
Val函数会自动过滤后续非数字字符,无需额外判断第二位是否为数字:
TaskNum: IIf([Pos]>0,Val(Mid([txtPMTaskDesc],[Pos],2)),0)
单字段合并写法
如果不需要单独保留位置字段,可以直接合并为一个计算字段:
TaskNum: IIf(IIf(Mid([txtPMTaskDesc],1,1) Like "[0-9]",1,IIf(Mid([txtPMTaskDesc],2,1) Like "[0-9]",2,IIf(Mid([txtPMTaskDesc],3,1) Like "[0-9]",3,IIf(Mid([txtPMTaskDesc],4,1) Like "[0-9]",4,IIf(Mid([txtPMTaskDesc],5,1) Like "[0-9]",5,IIf(Mid([txtPMTaskDesc],6,1) Like "[0-9]",6,IIf(Mid([txtPMTaskDesc],7,1) Like "[0-9]",7,IIf(Mid([txtPMTaskDesc],8,1) Like "[0-9]",8,IIf(Mid([txtPMTaskDesc],9,1) Like "[0-9]",9,IIf(Mid([txtPMTaskDesc],10,1) Like "[0-9]",10,0))))))))>0,Val(Mid([txtPMTaskDesc],IIf(Mid([txtPMTaskDesc],1,1) Like "[0-9]",1,IIf(Mid([txtPMTaskDesc],2,1) Like "[0-9]",2,IIf(Mid([txtPMTaskDesc],3,1) Like "[0-9]",3,IIf(Mid([txtPMTaskDesc],4,1) Like "[0-9]",4,IIf(Mid([txtPMTaskDesc],5,1) Like "[0-9]",5,IIf(Mid([txtPMTaskDesc],6,1) Like "[0-9]",6,IIf(Mid([txtPMTaskDesc],7,1) Like "[0-9]",7,IIf(Mid([txtPMTaskDesc],8,1) Like "[0-9]",8,IIf(Mid([txtPMTaskDesc],9,1) Like "[0-9]",9,IIf(Mid([txtPMTaskDesc],10,1) Like "[0-9]",10,0)))))))),2)),0)
排序使用
得到的TaskNum为数值类型,直接在查询的排序栏选择升序或降序即可实现按提取数字排序的需求,不会出现文本排序时1、10、2的错位问题。
内容的提问来源于stack exchange,提问作者gusgray
相关产品推荐
相关产品推荐

