I am just curious - I know about NULL safe equal operator <=>, but is there some NULL safe NOT equal operator? Or I have to always use something like this:
(tab.id != 1 OR tab.id IS NULL)
or someone prefers
!(tab.id <=> 1)
I found that NOT (NULL <=> 1) works and I think it is also ISO standard compliant, but is cumbersome. A better way to show using column names would be like this: NOT (tbl.col1 <=> 1)
<=> is not standard SQL, it's a MySQL extension. The standard equivalent null-safe comparison is, typically for SQL, much more verbose: IS [NOT] DISTINCT FROM.COALESCE(tab.id, 0) != 1
Can be used here if you like it. I goes through the parameters, and returns the first value that isn't NULL. In this case if it's NULL, it will compare 0 != 1. Although it may use more signs, it's still easier to manage instead of being forced to always have opposite "booleans" as a solution in those cases.
Read documentation for COALESCE()
!(tab.id <=> 1) seems to get a performance boost as compared to this one. I ran explain on a table with a few thousand rows and the former gets a better value in the filtered column.If you know that the RHS of the comparison IS NOT NULL:
COALESCE(tab.id != 1, 1)
Or
COALESCE(tab.id != 1, TRUE)
will give you the correct result.
Whether this is better more readable than:
(tab.id != 1 OR tab.id IS NULL)
Is debatable..
I'd also be tempted to filter out the NULL logic first with comparisons, so I don't have to think about them! I'd probably write your first equation as:
(tab.id IS NULL OR tab.id != 1)
Performance will depend on prevalence of NULLs however.
tab.id