Ответ 1
Чтобы сравнить значения NULL
, вы должны использовать предикат IS NULL
, например:
SELECT table1.*, table2.*
FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.surname IS NULL
Это следующий вопрос к моему последнему вопросу о соединениях таблиц в MySQL
Мне нужно иметь возможность выбирать значения NULL из левой объединенной таблицы.
Здесь мое соединение:
table1.id | table1.name | table2.id | table2.surname
1 | John | 1 | Doe
2 | Michael | 2 | Anderson
3 | Anna | NULL | NULL
4 | Sue | NULL | NULL
Я хотел бы выбрать WHERE table2.surname = NULL, но такой запрос не работает
SELECT table1.*,table2.*
FROM table1
LEFT JOIN table2
ON table1.id=table2.id
WHERE table2.surname=NULL
Я могу несколько понять, что логика этого не дает мне никаких результатов, но должен быть способ захватить их результаты?
Оцените любую помощь
Чтобы сравнить значения NULL
, вы должны использовать предикат IS NULL
, например:
SELECT table1.*, table2.*
FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.surname IS NULL
Вы должны использовать IS NULL
вместо = NULL
:
WHERE table2.surname IS NULL
Причина, по которой вы не можете просто сделать = NULL
, состоит в том, что NULL
по существу является "неизвестным" и не может равным или не равно ни к чему (даже не сам), поэтому попытка сравнить его с чем-то, как будто он должен быть точным совпадением, просто возвращает NULL
вместо ожидаемого логического 0
или 1
, и именно поэтому ваш запрос возвращался пустой результат.
Там четкое различие между "неизвестно" и "равно неизвестно". Вы можете с уверенностью проверить, что неизвестно неизвестно или не, но вы не можете проверить, если что-то "равно" неизвестно, поскольку неизвестно неизвестно, и это не имеет смысла.
Кроме того, поскольку вы используете MySQL, другой вариант заключается в использовании table2.surname <=> NULL
, где <=>
- это оператор сравнения NULL-Safe, специфичный для MySQL, но старайтесь не использовать его и просто придерживаться стандартного SQL (IS NULL
/IS NOT NULL
)
попробуйте:
SELECT table1.*,table2.*
FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.surname IS NULL
В соответствии с спецификацией MySQL вы должны использовать "IS NULL" вместо "= NULL". В нем говорится, что "(NULL = NULL) равно NULL". Но NULL равен False, когда он используется как булевский.