In how many languages is Null not equal to anything not even Null?
Oracle is this way.
SELECT * FROM dual WHERE NULL=null; --no rows returned
It's this way in SQL (as a logic language) because null means unknown/undefined.
However, in programming languages (like say, C++ or C#), a null pointer/reference is a specific value with a specific meaning -- nothing.
Two nothings are equivilent, but two unknowns are not. The confusion comes from the fact that the same name (null) is used for both concepts.
MySQL has a null-safe equality operator, <=>, which returns true if both sides are equal or both sides are null. See MySQL Docs.
You can make ruby work that way:
class Null
def self.==(other);false;end
end
n=Null
print "Null equals nothing" if n!=NULL
In VB6 the expression Null = Null
will produce Null
instead of True
as you would expect.
This will cause a runtime error if you try to assign it to a Boolean, however if you use it
as the condition of "If ... Then
" it will act like False
. Moreover Null <> Null
will also
produce Null
, so:
In VB6 you could say that Null
is neither equal to itself (or anything else), nor unequal!
You're supposed to test for it using the IsNull()
function.
VB6 also has other special values:
Nothing
for object references.Nothing = Nothing
is a compile error. (you're supposed to compare it using "is
")Missing
for optional parameters which haven't been given. It has no literal representation so you can't even writeMissing = Missing
. (the test isIsMissing(foo)
)Empty
for uninitialized variables. This one does test equal to itself although there's also a functionIsEmpty()
.- ... let me know if I've forgotten one
I remember being a bit disgusted with VB.
In C#, Nullable<bool> has interesting properties with respect to logical operators, but the equality operator is the same as other types in that language (i.e., ((bool?)null == (bool?)null) == true).
To preserve the short-circuited behavior of the short-circuited logical operators, and to preserve consistency with the non-short-circuited logical operators, the nullable boolean has some interesting properties. For example: true || null == true. false && null == false, etc. This stands in direct contradiction with other three-valued logic languages such as ANSI SQL.
In SQL you would have to do something like:
WHERE column is NULL
rather than
WHERE column = NULL