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

SQL联合使用LIKE、OR、AND查询时返回deleted=1数据如何修复

问题根因

SQL逻辑运算符存在固定执行优先级:AND 的运算优先级高于 OR。你当前编写的WHERE子句,实际被数据库解析执行的逻辑等价于:

WHERE nomor_formulir LIKE '%mikha%' OR (harga_pelita LIKE '%5%' AND deleted=0)

按照这个逻辑,只要记录满足nomor_formulir LIKE '%mikha%',无论deleted字段取值是0还是1,都会被纳入结果集,这就是返回结果中出现deleted=1记录的直接原因。

基础修正方法

使用圆括号明确包裹由OR连接的两个模糊匹配条件,强制调整运算优先级:先计算两个匹配规则的或逻辑,再将结果和deleted=0做与逻辑校验。修正后的语句如下:

SELECT * FROM table_tutup_kas 
LEFT JOIN table_formulir_pelita 
  ON table_formulir_pelita.id_formulir = table_tutup_kas.id_formulir  
WHERE (nomor_formulir LIKE '%mikha%' OR harga_pelita LIKE '%5%') 
  AND deleted = 0
其他可选实现方案
  • 提前过滤关联数据:如果deleted字段归属明确(比如属于左表table_tutup_kas),可以将过滤条件拆分到关联子句中,提前裁剪参与关联计算的数据量,提升查询效率;如果右表也存在删除标记需要过滤,也可以同步在ON子句中添加对应条件:
SELECT * FROM table_tutup_kas 
LEFT JOIN table_formulir_pelita 
  ON table_formulir_pelita.id_formulir = table_tutup_kas.id_formulir
  AND table_formulir_pelita.deleted = 0 -- 按需添加,过滤右表已删除数据
WHERE (nomor_formulir LIKE '%mikha%' OR harga_pelita LIKE '%5%') 
  AND table_tutup_kas.deleted = 0
  • 改用内关联提升性能:如果业务场景不需要保留左表中未匹配到右表记录的结果,可以将LEFT JOIN替换为INNER JOIN,数据库执行时的查询效率会明显提升:
SELECT * FROM table_tutup_kas 
INNER JOIN table_formulir_pelita 
  ON table_formulir_pelita.id_formulir = table_tutup_kas.id_formulir  
WHERE (nomor_formulir LIKE '%mikha%' OR harga_pelita LIKE '%5%') 
  AND deleted = 0

实操提示:如果两个关联表都存在deleted、nomor_formulir、harga_pelita这类同名字段,建议在字段前添加表名前缀做明确指向,避免触发字段歧义报错。

内容的提问来源于stack exchange,提问作者mikk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:01:26