php - MySQL 在 Where 条件下与 NULL 的比较
问题描述
我有一个这样的 MySql 表结构:(用于英语句子学习系统):
learn_status column
可以是0
或1
。
3 practices columns
可以是NULL
或-1
或0
或1
。
╔═════════════╦══════════════╦════════════╦════════════╦════════════╦════════╗
║ sentence_id ║ learn_status ║ practice_1 ║ practice_2 ║ practice_3 ║ others ║
╠═════════════╬══════════════╬════════════╬════════════╬════════════╬════════╣
║ 0 ║ 1 ║ NULL ║ NULL ║ NULL ║ more ║
║ 1 ║ 0 ║ 1 ║ 0 ║ 1 ║ more ║
║ 2 ║ 0 ║ -1 ║ NULL ║ 0 ║ more ║
║ 3 ║ 0 ║ NULL ║ NULL ║ NULL ║ more ║
║ 4 ║ 0 ║ 1 ║ 1 ║ 1 ║ more ║
╚═════════════╩══════════════╩════════════╩════════════╩════════════╩════════╝
我想得到两个条件的句子:
- learn_status 应该是 0
- 所有 3 个实践列不等于同时 1 个。
(如果 practice_1=1 & practice_2=1 & practice_3=1同时,则不应返回记录)
(如果其中一个等于1,那没关系,然后它应该返回记录)
我使用下面的 MySQL 代码,但它不能正常工作:
SELECT * FROM learnbox WHERE learn_status=0 AND NOT (practice_1=1 AND practice_2=1 AND practice_3=1)
它应该返回上表的 3 条记录:sentence_id=(1 & 2 & 3) 记录。
但它返回唯一的 sentence_id=(1 & 2) 并且无法正常工作。
谢谢
解决方案
如果至少有一个操作数是 ,则比较运算符=
将返回。因此,对于,您将获得所有三个练习场条件。NULL
NULL
sentence_id = 3
NULL
还有,NOT NULL
是NULL
;因此对于sentence_id = 3
,您的 Where 条件将是TRUE AND NULL
,等于NULL
,因此不会出现该行。在MySQL 文档中查看有关运算符及其行为的更多详细信息。
解决方案1:您可以使用Ifnull()函数,检查NULL
从练习场返回的条件,并将其设置为FALSE
。
尝试以下操作:
SELECT * FROM learnbox
WHERE learn_status=0
AND NOT IFNULL((practice_1 = 1 AND
practice_2 = 1 AND
practice_3 = 1)
, FALSE)
解决方案 2:您也可以使用 null 安全的相等操作 ( <=>
)。从文档:
NULL 安全相等。此运算符执行与 = 运算符类似的相等比较,但如果两个操作数都为 NULL,则返回 1 而不是 NULL,如果一个操作数为 NULL,则返回 0 而不是 NULL。
所以这里会为练习场条件返回0 。
您也可以尝试以下方法:
SELECT * FROM learnbox
WHERE learn_status = 0
AND NOT (practice_1 <=> 1 AND
practice_2 <=> 1 AND
practice_3 <=> 1)
推荐阅读
- javascript - 无法在函数中删除EventListener
- android - RecyclerView中画布对象上的Android Talkback可访问性滑动以启用删除按钮
- c# - LINQ:“select new {e.FName, e.LName}”和“select (e.FName, e.LName)”之间的区别?
- javascript - 从提及中查找用户(Discord.js,斜线命令)
- macos - Poppler 无法使用 Macports 安装;似乎没有现有的解决方案有效
- chainlink - 布朗尼编译器“无法导入布朗尼”
- reactjs - 为什么有可用的对象数组时 react-select 不输出任何内容?
- angular - 模块 '"@angular/core"' 没有导出的成员 'ReactiveFormsModule'
- python - 我在使用 scipy.optimize.curve_fit 并获得 RuntimeWarning: 除以在 double_scalars 中遇到的问题时遇到问题
- python - 使用python将json数据插入postgres表