Почему «WHERE text != «что-то» также исключает все строки с нулевыми значениями?

#mysql #sql

#mysql #sql

Вопрос:

Извините, это, вероятно, действительно частый вопрос, но я действительно не знаю, как сформулировать поиск Google, который его находит.

ВЫБЕРИТЕ * ИЗ таблицы, где текстовое поле != «Слово»;

  1. Это игнорирует все строки, где текстовое поле содержит строку «Word», но также игнорирует все строки, где текстовое поле равно НУЛЮ. Почему?
  2. Каков правильный способ выбора ВСЕХ строк (даже нулей), кроме строк с определенной строкой в текстовом поле?

Комментарии:

1. Потому NULL что означает НЕИЗВЕСТНО. Поэтому вы не можете сказать, что оно равно или неравно чему-то ИЗВЕСТНОМУ. Следовательно, сравнение с NULL всегда будет возвращаться NULL , что неверно.

2. Вот как работает сравнение с нулем! Сделайте where (textcolumn <> "Word" or textcolumn is null) .

Ответ №1:

Почти все сравнения с NULL возвратом NULL (наиболее распространенными исключениями являются IS NULL и IS NOT NULL ). И в WHERE предложениях NULL обрабатывается так же, как «false», то есть строки фильтруются.

MySQL предлагает NULL безопасный оператор сравнения. Вы можете использовать:

 where not textfield <=> 'Word'
 

<=> возвращает true или false — никогда NULL — так что он делает то, что вы ожидаете.

Позвольте мне добавить: стандарт SQL имеет NULL оператор -safe . Итак, в стандартном SQL это будет:

 where textfield is distinct from 'Word'
 

Однако не многие базы данных поддерживают стандартный синтаксис — пока.

Комментарии:

1. upvlote для обсуждения <=>

Ответ №2:

Вам нужно указать базе данных включить строки, где textfield значение равно NULL:

 SELECT *
  FROM table
  WHERE textfield != 'Word' OR
        textfield IS NULL
 

В реляционной базе данных любое прямое сравнение с NULL (с использованием операторов сравнения, таких как = , <> или != , < , > , <= , или >= ) вернет NULL или UNKNOWN (в зависимости от базы данных). Это сделано намеренно и специально, но иногда это делает его немного неудобным. Если вы хотите включить нули, вам нужно указать это.

В некоторых базах данных вы можете использовать функции NVL or COALESCE для предоставления «значения по умолчанию» для замены нулей, как в:

 SELECT *
  FROM table
  WHERE NVL(textfield, 'X') != 'Word'
 

или

 SELECT *
  FROM table
  WHERE COALESCE(textfield, 'X') != 'Word'
 

COALESCE является версией ANSI, допускает несколько аргументов и является предпочтительным решением. Например, если вы хотите вернуть textfield , но если было NULL, которое вы хотели вернуть text2 , а затем, если text2 также было NULL, которое вы хотели вернуть X , вы могли бы использовать

 SELECT *
  FROM table
  WHERE COALESCE(textfield, text2, 'X') != 'Word'