mysql在where条件下与null的比较

axzmvihb  于 2021-05-30  发布在  Mysql
关注(0)|答案(1)|浏览(480)

我有一个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  ║
╚═════════════╩══════════════╩════════════╩════════════╩════════════╩════════╝

我想得到有两个条件的句子:
学习状态应为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条记录:句子\u id=(1&2&3)记录。
但是它只返回一个句子\u id=(1&2),不能正常工作。
谢谢

dwbf0jvd

dwbf0jvd1#

比较运算符 = 会回来的 NULL 如果至少有一个操作数是 NULL . 所以对于 sentence_id = 3 ,你得到了 NULL 对于所有三个练习场条件。
也, NOT NULLNULL ; 因此 sentence_id = 3 ,你的条件是什么 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,则返回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)

相关问题