Может кто-нибудь объяснить, пожалуйста, следующее поведение в SQL?
SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
sql
sql-server
tsql
null
Максим Гершкович
источник
источник
<>
что это в спецификации 92, но большинство поставщиков поддерживают!=
и / или она включена в более позднюю спецификацию, такую как 99 или 03.!=
до ~ 9i, как я понимаю, что привело к большому синтаксису ANSI-92. Я верю, что MySQL похож, начиная поддержку в 4.x.!=
могло быть включено в более позднюю спецификацию в качестве альтернативы<>
. У меня нет новых спецификаций, поэтому я не могу сказать наверняка.WHERE MyColumn != NULL
илиWHERE MyColumn = NULL
детерминированным? Или, другими словами, гарантированно всегда возвращать 0 строк, независимо от тогоMyColumn
, обнуляется ли это в базе данных или нет?!=
выполняется только оценка значений, выполнение чего-либо подобногоWHERE MyColumn != 'somevalue'
не будет возвращать записи NULL.NULL не имеет значения и поэтому не может сравниваться с использованием операторов скалярного значения.
Другими словами, никакое значение не может быть равно (или не равно) NULL, потому что NULL не имеет значения.
Следовательно, SQL имеет специальные предикаты IS NULL и IS NOT NULL для работы с NULL.
источник
'a' != null
НЕ возвращать значение (true
/1
) нелогично и время от времени меня ловит! Я бы подумал, что «какое-то значение по сравнению с отсутствием» всегда будет «не равным», но, может быть, это только я ?!SELECT * FROM MyTable WHERE coalesce(MyColumn, 'x') <> 'x'
назначать константу, если она имеет значение NULL, при условии, что вы предоставляете соответствующий тип данных для значения дозорного x (в данном случае строка / символ). Это синтаксис TSQL, но Oracle и другие движки имеют схожие функции.Обратите внимание, что это поведение является поведением по умолчанию (ANSI).
Если ты:
http://msdn.microsoft.com/en-us/library/ms188048.aspx
Вы получите разные результаты.
SET ANSI_NULLS OFF
видимо, уйду в будущем ...источник
create unique index UK_MyTable on MyTable (Column) where Column is not null
): msdn.microsoft.com/en-us/library/cc280372.aspxSET ANSI_NULLS
установлено значение OFF, операторы сравнения Equals (=) и Not Equal To (<>) не соответствуют стандарту ISO. Оператор SELECT, который использует,WHERE column_name = NULL
возвращает строки с нулевыми значениями в column_name. Оператор SELECT, который использует,WHERE column_name <> NULL
возвращает строки, которые имеют ненулевые значения в столбце. Кроме того, оператор SELECT, который использует,WHERE column_name <> XYZ_value
возвращает все строки, которые не являются XYZ_value и которые не равны NULL. ИМХО, это последнее утверждение кажется немного странным в том смысле, что оно исключает нули из результатов!В SQL все, что вы оцениваете / вычисляете с
NULL
результатами в НЕИЗВЕСТНОВот почему
SELECT * FROM MyTable WHERE MyColumn != NULL
илиSELECT * FROM MyTable WHERE MyColumn <> NULL
дает вам 0 результатов.Для проверки
NULL
значений предусмотрена функция isNull.Кроме того, вы можете использовать
IS
оператор, как вы использовали в третьем запросе.Надеюсь это поможет.
источник
Единственный тест для NULL - это NULL или не NULL. Проверка на равенство бессмысленна, потому что по определению никто не знает, что это такое.
Вот статья в Википедии для чтения:
https://en.wikipedia.org/wiki/Null_(SQL)
источник
Мы используем
вернуть все строки, где MyColumn равен NULL, или все строки, где MyColumn является пустой строкой. Для многих «конечных пользователей» проблема пустых и пустых строк - это различие без необходимости и смысла.
источник
Я просто не вижу функциональной и плавной причины, по которой значения NULL не сопоставимы с другими значениями или другими значениями NULL, поскольку мы можем четко сравнить их и сказать, что они одинаковы или нет в нашем контексте. Это забавно. Просто из-за некоторых логических выводов и последовательности мы должны постоянно с этим беспокоиться. Это не функционально, сделайте его более функциональным и предоставьте философам и ученым возможность сделать вывод, является ли оно последовательным или нет и содержит ли оно «универсальную логику». :) Кто-то может сказать, что это из-за индексов или чего-то еще, я сомневаюсь, что эти вещи не могут поддерживать нулевые значения, такие же как значения. Это то же самое, что сравнивать два пустых стакана, один - бокал для вина, а другой - бокал для пива, мы не сравниваем типы объектов, а значения, которые они содержат, так же, как вы могли бы сравнить int и varchar, с нулем it ' Еще проще, ничего общего и ничего общего с двумя небытиями, они одинаковы, очевидно сопоставимы мной и всеми, кто пишет sql, потому что мы постоянно нарушаем эту логику, сравнивая их странным образом из-за некоторых стандартов ANSI. Почему бы не использовать компьютерную мощность, чтобы сделать это для нас, и я сомневаюсь, что это замедлило бы ситуацию, если бы все, что связано, строилось с учетом этого. «Это не ноль, это ничего», это не яблоко, это apfel, давай ... Функционально это твой друг, и здесь тоже есть логика. В конце концов, единственное, что имеет значение, - это функциональность, и использование нулей таким образом приносит более или менее функциональность и простоту использования. Это более полезно? потому что мы постоянно нарушаем эту логику, сравнивая их странным образом из-за некоторых стандартов ANSI. Почему бы не использовать компьютерную мощность, чтобы сделать это для нас, и я сомневаюсь, что это замедлило бы ситуацию, если бы все, что связано, строилось с учетом этого. «Это не ноль, это ничего», это не яблоко, это apfel, давай ... Функционально это твой друг, и здесь тоже есть логика. В конце концов, единственное, что имеет значение, - это функциональность, и использование нулей таким образом приносит более или менее функциональность и простоту использования. Это более полезно? потому что мы постоянно нарушаем эту логику, сравнивая их странным образом из-за некоторых стандартов ANSI. Почему бы не использовать компьютерную мощность, чтобы сделать это для нас, и я сомневаюсь, что это замедлило бы ситуацию, если бы все, что связано, строилось с учетом этого. «Это не ноль, это ничего», это не яблоко, это apfel, давай ... Функционально это твой друг, и здесь тоже есть логика. В конце концов, единственное, что имеет значение, - это функциональность, и использование нулей таким образом приносит более или менее функциональность и простоту использования. Это более полезно? не яблоко, это apfel, давай ... Функционально это твой друг, и здесь тоже есть логика. В конце концов, единственное, что имеет значение, - это функциональность, и использование нулей таким образом приносит более или менее функциональность и простоту использования. Это более полезно? не яблоко, это apfel, давай ... Функционально это твой друг, и здесь тоже есть логика. В конце концов, единственное, что имеет значение, - это функциональность, и использование нулей таким образом приносит более или менее функциональность и простоту использования. Это более полезно?
Рассмотрим этот код:
Кто из вас знает, что вернет этот код? С или без НЕТ возвращает 0. Для меня это не функционально и сбивает с толку. В c # это все, как и должно быть, операции сравнения возвращают значение, логически это тоже создает значение, потому что если нет, сравнивать нечего (кроме. :)). Они просто «сказали»: все, что равно нулю, «возвращает» 0, и это создает много обходных путей и головных болей.
Это код, который привел меня сюда:
Мне просто нужно сравнить, если два поля (где) имеют разные значения, я мог бы использовать функцию, но ...
источник
NULL Невозможно сравнить с любым значением с помощью операторов сравнения. NULL = NULL является ложным. Нуль не является значением. Оператор IS специально разработан для обработки пустых сравнений.
источник
null = null
то, что можно использовать1=0
в каком-то специальном запросе. И если они жалуются, я изменяю это наnull != null
:)Старый вопрос, но следующий может предложить более подробную информацию.
null
не представляет значение или неизвестное значение. В нем не указано, почему нет значения, что может привести к некоторой неопределенности.Предположим, вы запустили такой запрос:
то есть вы ищете строки, где
ordered
иdelivered
даты совпадают.Чего ожидать, если один или оба столбца равны нулю?
Поскольку хотя бы одна из дат неизвестна, нельзя ожидать, что эти две даты совпадают. Это также тот случай, когда обе даты неизвестны: как они могут быть одинаковыми, если мы даже не знаем, какие они есть?
По этой причине любое выражение, рассматриваемое
null
как значение, должно завершиться ошибкой. В этом случае он не будет совпадать. Это также имеет место, если вы попробуете следующее:Опять же, как мы можем сказать, что два значения не одинаковы, если мы не знаем, что это такое.
SQL имеет специальный тест для пропущенных значений:
В частности, он не сравнивает значения, а скорее ищет пропущенные значения.
Наконец, что касается
!=
оператора, насколько мне известно, его нет ни в одном из стандартов, но он очень широко поддерживается. Он был добавлен, чтобы программисты из некоторых языков чувствовали себя как дома. Честно говоря, если программисту трудно вспомнить, какой язык он использует, у него плохое начало.источник
NULL
мы имеем в виду, что мы сравниваем значение с «имеющимNULL
значение», а не с «неопределенным значением, которое есть в основе»NULL
, но что мы не знаем ", который, очевидно, мы не сможем когда-либо знать. Это действительно облегчило бы ситуацию.IS NULL
гораздо сложнее, чем писать= NULL
. Я думаю, что было бы более последовательным, если быWHERE columnA = columnB
имел такую же интерпретациюWHERE columnA = NULL
, а не рассматривать последний как особый случай. Помните, чтоNULL
это не ценность. В языках программирования , где он является законным , чтобы проверитьvariable == null
это , потому чтоnull
имеет другое значение; это не представляет что-то неизвестное, но преднамеренное восстановление значения. Не так с SQL.IS NULL
AND=NULL
. Но взгляните на последний Ховер. Я устал испытывать это снова и снова, делая ненужные нагрузки? дополнительная проверка ...Я хотел бы предложить этот код, который я сделал, чтобы найти, есть ли изменение в значении,
i
являющемся новым значением иd
являющимся старым (хотя порядок не имеет значения). В этом отношении изменение от значения к нулю или наоборот является изменением, но от нуля к нулю не является (конечно, от значения к другому значению является изменение, но от значения к тому же самому это не так).Чтобы использовать эту функцию, вы можете
Результаты:
Использование sql_variant делает его совместимым для различных типов
источник
NULL это не что-нибудь ... это неизвестно. NULL не равняется ничему. Вот почему вы должны использовать волшебную фразу IS NULL вместо = NULL в ваших SQL-запросах.
Вы можете сослаться на это: http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx
источник