MySQL Сравнение с NULL в состоянии Где

0

У меня есть табличная структура MySql, как это: (для системы обучения английскому Sentence):

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

Я хочу получить предложения с двумя условиями:

  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) записи.

но он возвращает единственное предложение_прямое = (1 & 2) и работает неправильно.

Спасибо

  • 1
    Рассмотрите возможность пересмотра вашей схемы. Каждый раз, когда вы обнаруживаете, что у вас есть перечисленные столбцы (скажем, выше 2), должны прозвучать сигналы тревоги.
Теги:

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-безопасный. Этот оператор выполняет сравнение равенства, как оператор =, но возвращает 1, а не NULL, если оба операнда NULL, а 0, а не NULL, если один операнд равен NULL.

Таким образом, он будет возвращаться здесь 0 для практических полевых условий.

Вы также можете попробовать следующее:

SELECT * FROM learnbox 
WHERE learn_status = 0 
  AND NOT (practice_1 <=> 1 AND 
           practice_2 <=> 1 AND 
           practice_3 <=> 1)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню