Вопрос по sqlite – SQLite обработка NULL

4

У меня есть SQL-запрос, как

SELECT * FROM tableName WHERE colName != 'contents'

теперь вопреки тому, что я ожидал, это НЕ похоже на colName, где его содержимое равно «NULL». Смотря накак SQLite обрабатывает NULL а именно это условие"null OR true" is true Будучи верным для SqlLite, я бы подумал, что моего запроса было бы достаточно, чтобы выбрать строки сNULL заcolName, Я должен был понять это неправильно. Кто-нибудь может пролить свет на это для меня? Я могу просто использовать

SELECT * FROM tableName WHERE (colName != 'contents' OR colName IS NULL)

но я не думал, что мне придется.

Спасибо

Ваш Ответ

1   ответ
5

Вы можете обойти эту проблему, используяIS NOT скорее, чем!=, Если вы посмотрите нараздел операторов этого документа вы увидите:

The IS and IS NOT operators work like = and != except when one or both of the operands are NULL. In this case, if both operands are NULL, then the IS operator evaluates to 1 (true) and the IS NOT operator evaluates to 0 (false). If one operand is NULL and the other is not, then the IS operator evaluates to 0 (false) and the IS NOT operator is 1 (true). It is not possible for an IS or IS NOT expression to evaluate to NULL. Operators IS and IS NOT have the same precedence as =.

Я проверил это сам:

sqlite> create table temp( dataColumn, nullColumn );
sqlite> insert into temp( dataColumn, nullColumn ) values ( 'test', NULL );
sqlite> select * from temp where nullColumn != 'test';
sqlite> select * from temp where nullColumn IS NOT 'test';
test|
sqlite> select * from temp where dataColumn IS NOT 'test';
sqlite>

Из немного больше играть, кажется, что!= операторwill оценитьNULL когда вы используете это, чтобы сравнить что-то сNULL:

sqlite> select ( 'contents' != NULL );

sqlite> select ( 'contents' == NULL );

sqlite> select ( 'contents' IS NULL );
0
sqlite> select ( 'contents' IS NOT NULL );
1

Предположительно, именно поэтому вы не получаете ожидаемого поведения - вы эффективно говоритеWHERE NULL != 'contents' который оценивается как NULL, и не удовлетворяет предложению WHERE

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Dori

Похожие вопросы