В скольких языках Null не равен ничему, даже не Null?
-
09-06-2019 - |
Вопрос
В скольких языках 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