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

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

  1. Это игнорирует все строки, в которых текстовое поле содержит строку «Word», но также игнорирует все строки, в которых текстовое поле имеет значение NULL. Зачем?

  2. Как правильно выбрать ВСЕ строки (даже NULLS), кроме строк с определенной строкой в ​​текстовом поле?

1
James T 3 Фев 2021 в 12:42

2 ответа

Лучший ответ

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

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

where not textfield <=> 'Word'

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

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

where textfield is distinct from 'Word'

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

2
Gordon Linoff 3 Фев 2021 в 12:27

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

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

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

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

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'
2
Bob Jarvis - Reinstate Monica 3 Фев 2021 в 13:33
66024835