patternsqlMinor
Returning rows where all non-NULL values are equal
Viewed 0 times
rowsnonallnullwhereareequalreturningvalues
Problem
Is there a simpler T-SQL construct for "all of these columns to be equal (NULLs ignored) on a row" - effective I want to say:
An alternative for 3 columns is:
i.e. "All non-NULL columns a, b, c must be equal or all columns may be null"
Obviously a PIVOT/UNPIVOT implementation could be done or a complex CASE statement, but I'm looking for something relatively simple.
In this case, the columns are all integers, so I guess there is probably a math trick I could figure out.
WHERE MIN(a, b, c) = MAX(a, b, c) OR COALESCE(a, b, c) IS NULL- this would be the equivalent of the COALESCEs of all the permutations to be equal - but there is no non-aggregating MIN/MAX function
An alternative for 3 columns is:
WHERE (
COALESCE(a, b, c) = COALESCE(b, c, a)
AND COALESCE(a, b, c) = COALESCE(c, a, b)
AND COALESCE(a, b, c) = COALESCE(b, a, c)
AND COALESCE(a, b, c) = COALESCE(a, c, b)
AND COALESCE(a, b, c) = COALESCE(c, b, a)
)
OR COALESCE(a, b, c) IS NULLi.e. "All non-NULL columns a, b, c must be equal or all columns may be null"
Obviously a PIVOT/UNPIVOT implementation could be done or a complex CASE statement, but I'm looking for something relatively simple.
In this case, the columns are all integers, so I guess there is probably a math trick I could figure out.
Solution
The most compact syntax I can find is:
Based on an idea from one of my old blog posts that describes how to use
SELECT *
FROM @T AS t
WHERE EXISTS
(
SELECT ISNULL(ISNULL(a, b), c)
INTERSECT
SELECT ISNULL(ISNULL(b, c), a)
INTERSECT
SELECT ISNULL(ISNULL(c, a), b)
);Based on an idea from one of my old blog posts that describes how to use
INTERSECT and EXCEPT to replace comparisons like a <> b OR (a IS NULL AND b IS NULL) with NOT EXISTS (a INTERSECT b).Code Snippets
SELECT *
FROM @T AS t
WHERE EXISTS
(
SELECT ISNULL(ISNULL(a, b), c)
INTERSECT
SELECT ISNULL(ISNULL(b, c), a)
INTERSECT
SELECT ISNULL(ISNULL(c, a), b)
);Context
StackExchange Database Administrators Q#33708, answer score: 8
Revisions (0)
No revisions yet.