запрос "не равно" не работает - PullRequest
29 голосов
/ 25 января 2012

У меня очень простой запрос, подобный этому:

SELECT * FROM `all_conversations` WHERE `deleted_1` != '1';

И мой deleted_1 по умолчанию равен null или некоторому идентификатору пользователя, но по какой-то причине этот запрос всегда возвращает мне 0 строк, я также пытался <>, но все равно не повезло, что могло быть не так?

EDTI Итак, после выполнения большего количества запросов я обнаружил, что моей проблемой было значение по умолчанию поля deleted_1, это было NULL, поэтому я изменил свой запрос, и теперь он работает нормально:

SELECT *
FROM `all_conversations`
WHERE `deleted_1` != 'NULL'
AND `deleted_1` != 23

Ответы [ 6 ]

72 голосов
/ 25 января 2012
SELECT * FROM all_conversations WHERE deleted_1 <> 1 OR deleted_1 IS NULL

Значения NULL требуют специальной обработки: http://dev.mysql.com/doc/refman/5.1/en/working-with-null.html

Я бы предложил использовать оператор diamond (<>) в пользу !=, поскольку первый является допустимым SQL, а второй - добавлением MySQL.

5 голосов
/ 01 сентября 2016

Я рекомендую использовать NULL-безопасный оператор и отрицание

SELECT * FROM `all_conversations` WHERE NOT(`deleted_1` <=> '1');
4 голосов
/ 25 января 2012

Можете ли вы попробовать это: deleted_1 is not null and deleted_1 != '1'?

mysql> select 0 is not null and 0 != '1', 1 is not null and 1 != '1', null is not null and null != '1';
+----------------------------+----------------------------+----------------------------------+
| 0 is not null and 0 != '1' | 1 is not null and 1 != '1' | null is not null and null != '1' |
+----------------------------+----------------------------+----------------------------------+
|                          1 |                          0 |                                0 |
+----------------------------+----------------------------+----------------------------------+

Или это deleted_1 is null or deleted_1 != '1':

mysql> select 0 is null or 0 != '1', 1 is null or 1 != '1', null is null or null != '1';
+-----------------------+-----------------------+-----------------------------+
| 0 is null or 0 != '1' | 1 is null or 1 != '1' | null is null or null != '1' |
+-----------------------+-----------------------+-----------------------------+
|                     1 |                     0 |                           1 |
+-----------------------+-----------------------+-----------------------------+

Это действительно зависит от того, что вы хотите вернуть.

2 голосов
/ 04 августа 2015

Попробуйте это .. Надеюсь, это будет работать для вас

SELECT *
FROM `all_conversations`
WHERE `deleted_1` IS NOT NULL
AND `deleted_1` <> 23
0 голосов
/ 12 марта 2019

Вы не можете использовать операторы арифметического сравнения, такие как =, <или <>, чтобы проверить на NULL.

Чтобы продемонстрировать это для себя, попробуйте следующий запрос:

mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+

так что вы должны сказать,

SELECT * FROM `all_conversations` WHERE `deleted_1` <> '1' and `deleted_1` is null;

your_field IS явно NULL, поскольку NULL не может быть клубом со значениями, использующими арифметические операторы, и имеет собственное значение BOOLEAN

0 голосов
/ 25 января 2012

Как насчет удаления одинарных кавычек вокруг 1?

SELECT * FROM `all_conversations` WHERE `deleted_1` != 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...