Вопрос

В скольких языках Null не равен ничему, даже не Null?

Это было полезно?

Решение

В SQL (как в языке логики) именно так и происходит, поскольку значение null означает неизвестное/неопределенное.

Однако в языках программирования (например, C++ или C#) нулевой указатель/ссылка — это конкретное значение с определенным значением — ничего.

Два ничто эквивалентны, а два неизвестных — нет.Путаница возникает из-за того, что для обоих понятий используется одно и то же имя (null).

Другие советы

В VB6 выражение Null = Null будет производить Null вместо True как и следовало ожидать.Это приведет к ошибке времени выполнения, если вы попытаетесь назначить ее логическомуIf ... Then"это будет действовать как False.Более того Null <> Null воля такжепроизводить Null, так:

В VB6 вы могли бы сказать, что Null не равен ни себе (или чему-либо еще), ни неравен!

Вы должны проверить это, используя IsNull() функция.

VB6 также имеет другие специальные значения:

  • Nothing для ссылок на объекты. Nothing = Nothing это ошибка компиляции.(вы должны сравнивать его, используя "is")
  • Missing для необязательных параметров, которые не были указаны.У него нет буквального представления, поэтому вы даже не можете написать Missing = Missing.(тест есть IsMissing(foo))
  • Empty для неинициализированных переменных.Этот тест равен самому себе, хотя есть также функция IsEmpty().
  • ...дайте мне знать, если я забыл один

Я помню, что испытывал некоторое отвращение к VB.

Oracle такой.

SELECT * FROM dual WHERE NULL=null;  --no rows returned

В MySQL есть оператор равенства, безопасный для нулевых значений, <=>, который возвращает true, если обе стороны равны или обе стороны равны нулю.Видеть Документы MySQL.

В C# Nullable<bool> имеет интересные свойства по отношению к логическим операторам, но оператор равенства такой же, как и другие типы в этом языке (т. е. ((bool?)null == (bool?)null) == true). .

Чтобы сохранить короткозамкнутый поведение сокращенных логических операторов и для сохранения согласованности с логическими операторами без короткого замыкания логическое значение, допускающее значение NULL, обладает некоторыми интересными свойствами.Например:Верно || null == true.false && null == false и т. д.Это находится в прямом противоречии с другими языками трехзначной логики, такими как ANSI SQL.

Вы можете заставить Ruby работать следующим образом:

class Null
 def self.==(other);false;end
end
n=Null
print "Null equals nothing" if n!=Null

В SQL вам нужно будет сделать что-то вроде:

WHERE column is NULL

скорее, чем

WHERE column = NULL
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top