При использовании SQL в функции where в предложении where нулевые значения не возвращаются в наборе результатов - PullRequest
1 голос
/ 18 марта 2019

Я создал простую тестовую таблицу, чтобы объяснить мой случай.Оба столбца имеют тип varchar.

My Test Table

Когда я запускаю запрос select * from test1 where TValue not in ('3','4'), он возвращает только следующие 3 значения.

Result

Я ожидаю, что он также вернет значение Sample6.Могу ли я узнать, почему он возвращает только 3 значения и что мне нужно сделать, чтобы он тоже возвращал значение Sample6.

Ответы [ 3 ]

5 голосов
/ 18 марта 2019

Поскольку NULL не работает так же, как и другие значения в «обычных» сравнениях, таких как =, <, IN и т. Д., Вам также необходимо использовать логику NULL:

WHERE TValue NOT IN (3,4)
   OR TValue IS NULL;

При сравнении с NULL с использованием выражения типа WHERE YourColumn != 1, где YourColumn имеет значение NULL, получится логическое выражение, возвращающее NULL.Обработчик данных будет возвращать значения только в тех случаях, когда логические выражения возвращают значение true, а NULL - нет, и, следовательно, NULL != 1 не приведет к возвращению строки (строк).

3 голосов
/ 18 марта 2019

Проблема заключается в трехуровневой логике, присущей базам данных SQL.

Любое выражение, сравнивающее значение с NULL, возвращает значение «unknown», которое отличается от «true» или «false».

  1 = 1           true
  1 = 0           false
  1 = NULL        undefined
  NULL = NULL     undefined (!)

Ваш запрос запрашивает записи, соответствующие критерию "tvalue NOT IN (3, 4)". Это вернет набор данных, в котором соблюдаются критерии соответствия. Поскольку сравнения значений NULL не возвращают «истинного» значения (и не «ложного»), они НЕ включаются в ваш возвращаемый набор.

Существует несколько обходных путей для этого поведения: во-первых, нужно явно проверить на null:

 WHERE tvalue IS NULL OR tvalue NOT IN (3,4)

Другой - использовать COALESCE для исключения сравнений NULL:

 WHERE COALESCE(tvalue, 0) NOT IN (3,4)

Для больших таблиц первый подход, вероятно, наиболее эффективен: сравнение с выражением (то есть выражением COALESCE) означает, что выражение должно выполняться для каждой строки в базовом наборе данных.

0 голосов
/ 18 марта 2019

Попробуйте:

SELECT * FROM test1
WHERE ISNULL(TValue, '') NOT IN ('3', '4')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...