Gibt es ein einfacheres T-SQL-Konstrukt für "alle diese Spalten müssen in einer Zeile gleich sein (NULL-Werte ignoriert)" - effektiv möchte ich sagen:
WHERE MIN(a, b, c) = MAX(a, b, c) OR COALESCE(a, b, c) IS NULL
- Dies wäre das Äquivalent der COALESCEs aller Permutationen, um gleich zu sein - es gibt jedoch keine nicht aggregierende MIN / MAX-Funktion
Eine Alternative für 3 Spalten ist:
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 NULL
dh "Alle Nicht-NULL-Spalten a, b, c müssen gleich sein oder alle Spalten können null sein"
Natürlich könnte eine PIVOT / UNPIVOT-Implementierung oder eine komplexe CASE-Anweisung durchgeführt werden, aber ich suche etwas relativ Einfaches.
In diesem Fall sind die Spalten alle Ganzzahlen, daher gibt es wahrscheinlich einen mathematischen Trick, den ich herausfinden könnte.
sql-server
t-sql
pivot
Cade Roux
quelle
quelle
Antworten:
Die kompakteste Syntax, die ich finden kann, ist:
Basierend auf einer Idee von einem meiner alten Blog - Posts , das beschreibt , wie verwenden
INTERSECT
undEXCEPT
Vergleiche zu ersetzen wiea <> b OR (a IS NULL AND b IS NULL)
mitNOT EXISTS (a INTERSECT b
).quelle
Sie können das Aggregieren über Spalten mit
VALUES(a),(b),(c)
oder, wenn Sie SQL Server vor 2008 verwenden, durchführenSELECT a UNION ALL SELECT b UNION ALL SELECT c
.Aktualisieren:
Etwas, das anscheinend etwas schneller sein sollte.
quelle
Eine Variation von @ Mikaels Antwort:
quelle
Dies kann leicht auf mehr als drei Spalten erweitert werden.
quelle