Question

In how many languages is Null not equal to anything not even Null?

Was it helpful?

Solution

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.

OTHER TIPS

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 write Missing = Missing. (the test is IsMissing(foo))
  • Empty for uninitialized variables. This one does test equal to itself although there's also a function IsEmpty().
  • ... let me know if I've forgotten one

I remember being a bit disgusted with VB.

Oracle is this way.

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

MySQL has a null-safe equality operator, <=>, which returns true if both sides are equal or both sides are null. See MySQL Docs.

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.

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 SQL you would have to do something like:

WHERE column is NULL

rather than

WHERE column = NULL
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top