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

MySQL如何在WHERE条件中筛选等于指定值或为NULL的记录

问题原因分析

你之前的写法存在三个核心错误,导致返回结果为空:

  • 错误1:误用单引号包裹字段名
    SQL中单引号用于标记字符串常量,你写的'color' = "red"实际是在比较字符串"color"和"red",而不是取color字段的值做判断,永远不会成立。字段名如果需要转义应该用反引号`包裹,或者直接写字段名不加引号。
  • 错误2:用=判断NULL值
    SQL中任何值和NULL做=比较的结果都是UNKNOWN,WHERE子句只会返回判断结果为TRUE的记录,所以color = NULL永远不会匹配到NULL值的记录,判断NULL必须用IS NULL语法。
  • 错误3:混淆NULL和空字符串
    NULL代表值不存在/未定义,和空字符串""是完全不同的两种值,所以color = ""也无法匹配到NULL记录。
正确写法

以下是几种可行的过滤写法:

  1. 标准SQL通用写法,兼容性最好,所有SQL数据库都支持:
WHERE `color` = 'red' OR `color` IS NULL

用到你的查询场景中,过滤后就能得到你预期的5条记录:Adam、Craig、Dawn、Edith、Gabriel。
2. MySQL专属简化写法,使用安全等于运算符<=>,可以直接正确匹配NULL值:

WHERE `color` <=> 'red' OR `color` <=> NULL
  1. 用IFNULL函数做值转换后判断,写法更简洁:
WHERE IFNULL(`color`, 'red') = 'red'
关联查询注意事项

如果你的多表关联用的是LEFT JOIN,请注意过滤条件的位置差异:如果要过滤JOIN后的全部结果集,就把条件写在WHERE子句中;如果要先过滤右表数据再做关联,就把条件写在ON子句中,避免过滤逻辑不符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:30:05