如何用LIKE结合IN筛选匹配boltPatterns的Vehicles数据?
需求与解决方案
数据表结构与测试数据
CREATE TABLE IF NOT EXISTS botPatterns ( `boltP` varchar(200) NOT NULL ); INSERT INTO `botPatterns` (`boltP`) VALUES ('6X135/6X139.7'), ('8X165.1'), ('8X165.1/8X170'), ('8X170'); CREATE TABLE IF NOT EXISTS Vehicles ( `Brand` varchar(200) NOT NULL, `Pattern` varchar(200) NOT NULL ); INSERT INTO `Vehicles` (`Brand`,`Pattern`) VALUES ('Audi','6X135'), ('Audi','8X165.1'), ('BMW','8X170'), ('Ford','9X139.7');
查询需求
- 获取所有存在对应螺栓模式的车辆数据,匹配规则:
- 车辆的螺栓模式与
botPatterns中的值精确匹配(比如Audi的8X165.1) - 车辆的螺栓模式包含在
botPatterns中以/分隔的任一子模式里(比如Audi的6X135包含在6X135/6X139.7中)
- 车辆的螺栓模式与
- 不符合匹配规则的(比如Ford的9X139.7)不应被返回
现有查询的问题
当前使用的查询语句仅支持精确匹配,无法满足包含匹配的需求:
select * from vehicles where pattern in ( select boltp from botpatterns )
解决方案
方案1:使用FIND_IN_SET函数
通过将botPatterns中的/替换为逗号,把分隔的子模式转为逗号分隔的列表,再用FIND_IN_SET检查车辆模式是否在列表中:
SELECT v.* FROM Vehicles v JOIN botPatterns bp ON FIND_IN_SET(v.Pattern, REPLACE(bp.boltP, '/', ',')) > 0;
方案2:使用LIKE模糊匹配
通过给模式前后拼接/,避免出现部分匹配的误判,再用LIKE进行匹配:
SELECT v.* FROM Vehicles v JOIN botPatterns bp ON CONCAT('/', bp.boltP, '/') LIKE CONCAT('%/', v.Pattern, '/%');
两种方案都能返回除Ford外的所有车辆数据,满足需求。
内容的提问来源于stack exchange,提问作者PyDeveloper
相关产品推荐
相关产品推荐

