SQL LIKE查询特定C6_CF代码的最优方案及问题求助
问题原因与解决方法
1. 原查询的错误根源
你的SQL返回全表数据是因为逻辑运算符优先级问题:AND的优先级高于OR。原语句中,C6_PRODUCT = 'OP78987' AND C6_NOTE = '' AND D_E_L_E_T_ = '' AND C6_CF LIKE '%5106%' 这部分是一个整体,而后面的OR C6_CF LIKE '%6106%'等条件是独立的——也就是说,只要C6_CF包含6106、6108等任意一个值,不管前面的三个条件是否满足,这条数据都会被查出来,自然就返回了全表符合OR条件的数据。
2. 修正后的正确查询
把所有C6_CF的LIKE条件用括号括起来,让它们作为一个整体和前面的条件用AND关联:
SELECT * FROM MYDB WHERE C6_PRODUCT = 'OP78987' AND C6_NOTE = '' AND D_E_L_E_T_ = '' AND ( C6_CF LIKE '%5106%' OR C6_CF LIKE '%6108%' OR C6_CF LIKE '%6106%' OR C6_CF LIKE '%5108%' OR C6_CF LIKE '%6403%' OR C6_CF LIKE '%5403%' OR C6_CF LIKE '%5933%' OR C6_CF LIKE '%6933%' OR C6_CF LIKE '%6912%' OR C6_CF LIKE '%5912%' OR C6_CF LIKE '%5908%' OR C6_CF LIKE '%6908%' );
3. 更优的实现方法
如果是MySQL数据库,可以用REGEXP来简化多个LIKE OR的写法,更简洁:
SELECT * FROM MYDB WHERE C6_PRODUCT = 'OP78987' AND C6_NOTE = '' AND D_E_L_E_T_ = '' AND C6_CF REGEXP '5106|6106|6108|5108|6403|5403|5933|6933|6912|5912|5908|6908';
如果C6_CF里的代码是用特定分隔符(比如逗号)分隔的独立项,还可以用FIND_IN_SET(仅适用于代码是完整独立值的场景,比如C6_CF = 'xxx,5106,xxx'):
-- 示例:假设分隔符是逗号 SELECT * FROM MYDB WHERE C6_PRODUCT = 'OP78987' AND C6_NOTE = '' AND D_E_L_E_T_ = '' AND ( FIND_IN_SET('5106', C6_CF) OR FIND_IN_SET('6106', C6_CF) -- 其他代码依次类推 );
4. 新手学习方向
- 吃透SQL逻辑运算符优先级:AND > OR,写复杂条件时必须用括号明确逻辑分组,避免逻辑混乱。
- 掌握MySQL字符串匹配工具:除了LIKE,了解REGEXP、FIND_IN_SET等函数的适用场景和限制。
- 规范表结构设计:如果C6_CF用于存储多个代码,建议拆分出关联表(比如
MYDB_CF,存储主表主键和单个CF代码),既提升查询效率,也避免模糊匹配的性能问题。 - 学习SQL执行计划:用
EXPLAIN查看查询执行流程,理解%xxx%这类模糊查询为什么会导致索引失效,以及优化思路。
内容的提问来源于stack exchange,提问作者LeoBertass
相关产品推荐
相关产品推荐

