You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:30:50