SQL-запрос возвращает неверные результаты - PullRequest
0 голосов
/ 08 июля 2019

В моей таблице есть один столбец с именем 'process', который имеет тип BOOLEAN и по умолчанию имеет значение NULL.Когда я устанавливаю значения 'process' для всех строк в NULL и выполняю запрос

SELECT * FROM `tablename` WHERE `process` != 1

MySQL возвращает пустой набор результатов.Я также получаю тот же результат, когда выполняю

SELECT * FROM `tablename` WHERE `process` = NULL

Более того, когда я использую PHP для печати строк, таких как

$result = mysqli_query($conn, "SELECT * FROM log");
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
    if ($row['process'] != 1)
        echo $row['time']." ".$row['event']."\n";
}

, я не получаю пустой набор результатов.Может кто-нибудь объяснить мне, где проблема?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 08 июля 2019

Когда вы запускаете SQL:

SELECT * FROM `tablename` WHERE `process` != 1

Набор результатов возвращается пустым, поскольку при этом будут искать записи, которые не имеют значения «1». NULL не является значением

SELECT * FROM `tablename` WHERE `process` = NULL

Это звучит совершенно неправильно, как я уже говорил, NULL не является значением. Конечно, это неправильный метод, который вы пытаетесь применить.

В двух словах, NULL не является значением, поэтому оно не может быть равно или не равно! Это не то же самое, что ноль 0, который является значением.

Проверьте как для лучшего понимания.

Надеюсь, это поможет вам!

0 голосов
/ 08 июля 2019

Ноль не является значением, которое может иметь столбец. Это больше похоже на состояние, для этого нужно написать

SELECT * FROM `tablename` WHERE `process` IS NULL

Также нельзя отменить предложение с помощью! =, В этом случае необходимо использовать <>.

0 голосов
/ 08 июля 2019

вы можете использовать IS NULL

SELECT * FROM tablename WHERE process IS NULL
0 голосов
/ 08 июля 2019

Если вы определяете логическое ложное значение, так как логический столбец равен , а не равно 1 (что означает 0 или NULL), тогда вам следует использовать эту логику:

SELECT *
FROM tablename
WHERE process <> 1 OR process IS NULL;

Вы также можете слегка консолидировать предложение WHERE, используя COALESCE:

SELECT *
FROM tablename
WHERE COALESCE(process, 0) <> 1;
0 голосов
/ 08 июля 2019

Получить запись, которая имеет значение NULL,

Вы должны использовать isnull() вместо столбца = NULL

SELECT * FROM `tablename` WHERE ISNULL(`process`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...