Intereting Posts
Запрос ActiveRecord для возврата связанных документов с использованием связанных документов Несколько вложений с PostgreSQL, если запись не существует SQL (Postgres): время до следующего месяца Как избежать ошибки OOM (вне памяти) при извлечении всех записей из огромной таблицы? Запросить пользователя для ввода одного, нескольких или всех значений в запросе Oracle Select Как я могу получить список с подсписками, используя один запрос? Как ограничить строки, где SUM столбца равно определенному значению в Oracle Как назначить нормальную таблицу из динамической сводной таблицы? Функция YEARFRAC на SQL Server не работает Массовая вставка базы данных Javascript DB (SQL) автоматизированные инструменты для стресс / нагрузки? Запрос автоматизации сверки Как рассчитать время между записями в SQL Server 2008 MySQL INSERT / UPDATE в столбце POINT Эффективно дублируйте некоторые строки в таблице PostgreSQL.

MYSQL Left Присоединиться, как выбрать значения 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, тогда как он используется как булеан.