#mysql #sql
#mysql #sql
Вопрос:
Извините, это, вероятно, действительно частый вопрос, но я действительно не знаю, как сформулировать поиск Google, который его находит.
ВЫБЕРИТЕ * ИЗ таблицы, где текстовое поле != «Слово»;
- Это игнорирует все строки, где текстовое поле содержит строку «Word», но также игнорирует все строки, где текстовое поле равно НУЛЮ. Почему?
- Каков правильный способ выбора ВСЕХ строк (даже нулей), кроме строк с определенной строкой в текстовом поле?
Комментарии:
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'