日常在Myexcel中做查询时,最常用的条件写法就是“形如”。它用来判断一个字符串是否包含另一个字符串。
但用的时间久了,会发现它不止一种用法。这篇就按使用频率,从常规到特殊,把三种写法整理一遍。
一、形如是什么?
简单说,判断左边的字符串是否包含右边的字符串。
“中华” 形如 “中华人民共和国” → ❌ 不成立
使用要求:左右两端都必须是字符型数据。
二、为什么必须加 %
很多初学者会写成:客户名称 形如 “山东”,结果一条都查不出来。
原因很简单:不加 % 的时候,形如的行为相当于“等于”,也就是“完整匹配”。
加了 % 之后,才变成“包含匹配”:
% 是“任意多个字符”的占位符。“%山东%” 的意思是——“山东”前面可以有任何内容,后面也可以有任何内容,只要出现“山东”就行。
三、写法一:常规模糊查询(最常用)
从材料信息表中,查出所有材料名称中包含“油管”的记录:
筛选条件:原材料信息_主表.材料名称 形如 “%” + 本报表.名称 + “%”
输入“油管”,查出所有材料名称中含有“油管”的材料。
四、写法二:让操作人员自己控制通配符
如果把筛选条件改成直接匹配(不加 %):
筛选条件:原材料信息_主表.材料名称 形如 本报表.名称
输入“油管”,只能查出名称完全等于“油管”的记录。
但这种方式的优点是:操作人员可以自己输入通配符来控制查询范围:
如果输入 %油%管,查询结果中还会出现“油水分离器三管”这类名称。
这种方式把主动权留给操作人员,灵活性更高,但也更依赖操作人员对通配符的理解。
五、写法三:反向用法——“长的匹配短的”(特殊场景)
前面两种写法都是“短的匹配长的”:输入一个短关键词,去源表的字段中查找包含该关键词的所有记录。
但有一种场景方向是反过来的。
场景
你手中有一个组合值,比如 “油管,铁丝,接头”,由多个材料名称拼在一起,存在本报表的“名称”字段里。这是一个长的字符串。
而源表(原材料信息表)中,每一条记录的“材料名称”字段存的是单个材料名称,是短的。
你要做的事是:检查这个长的组合值里,是否包含了某一条短的材料名称。如果包含,就把这条记录取出来。
写法
本报表.名称 形如 “%” + 原材料信息_主表.材料名称 + “%”
注意这里的“长的”是条件,“短的”是源表的每一条记录。方向和我们平时用的刚好相反。
效果
假设本报表.名称里存的是:“油管,铁丝,铜接头“
对原材料信息表逐行检查:
六、这种反向用法的限制:什么时候会出问题
写法三虽然灵活,但匹配结果受字段类型影响较大。因为形如匹配的是“包含关系”,不是“等于关系”,所以会出现以下情况:
1. 用“材料名称”做匹配时
写法三的匹配逻辑是:用每一条材料名称(短)去检查它是否出现在长字符串中。
如果长字符串里包含“铜接头”,那么:
“接头”出现在“铜接头”中(第2-3位) → 会被匹配
“铜接”也出现在“铜接头”中(第1-2位) → 也会被匹配
“钢头”不会出现在“铜接头”中(没有“钢”字) → 不会被匹配
“铜头”不会出现在“铜接头”中(“铜”和“头”不相邻) → 不会被匹配
形如只检查“这几个字符是否连续出现在长字符串中”,不关心这个词是什么意思。
所以写法三用名称做匹配时,可能出现“铜接头”匹配出“接头”和“铜接”的情况——这是形如的特性决定的,不是Bug。
2. 用“编码”做匹配时
如果编码本身有结构(比如 101201001,前6位代表分类),用“长的形如短的”去匹配编码时,101201 会匹配到所有以 101201 开头的编码。
3. 什么时候不会出问题
只有一种情况不会出现上述歧义:编码是纯顺序号,没有任何可拆分的结构。
例如:A0000001、A0000002、B00000001——每个编码都是独立完整的整体,没有“前几位代表分类”的含义。用长的形如短的去匹配时,只能匹配完全相同的编码,不会多出意料之外的结果。
所以我在实际的项目应用中,都不会直接用材料名称做筛选条件,而是再增加一个字段——材料编号,然后在用数据规范填充材料名称时,同时用额外返回值填充材料编号,再用材料编号做筛选条件。
这也是我在设计基本信息时推荐使用纯顺序号编码的原因之一。
七、三种写法对比
八、总结
- 写法一是最常用的,输入关键词,查所有包含该关键词的记录
- 写法三方向相反,用组合值去匹配源表记录,在特定场景下有用
- 写法三用名称做匹配时,可能出现“铜接头”匹配“接头””铜接“的歧义
- 写法三用编码做匹配时,如果编码有结构前缀,也会匹配到同类编码
这篇整理自我的工作日志,希望对遇到类似场景的朋友有点帮助。如果大家在设计查询时也碰到过其他有趣的用法,欢迎留言交流。