首页 > 解决方案 > MySQL 在 Where 条件下与 NULL 的比较

问题描述

我有一个这样的 MySql 表结构:(用于英语句子学习系统):

learn_status column可以是01

3 practices columns可以是NULL-101

╔═════════════╦══════════════╦════════════╦════════════╦════════════╦════════╗
║ 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  ║
╚═════════════╩══════════════╩════════════╩════════════╩════════════╩════════╝

我想得到两个条件的句子:

  1. learn_status 应该是 0
  2. 所有 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) 并且无法正常工作。

谢谢

标签: phpmysql

解决方案


如果至少有一个操作数是 ,则比较运算符=将返回。因此,对于,您将获得所有三个练习场条件。NULLNULLsentence_id = 3NULL

还有,NOT NULLNULL;因此对于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)

推荐阅读