2012-04-18 7 views
12

Ich habe 2 Nullable CHAR Spalten und ich muss überprüfen, ob nur einer von ihnen ist null.Tricky logische XOR für nullbare Werte

Doing

(a IS NULL AND b IS NOT NULL) OR (a IS NOT NULL AND b IS NULL) 

ist langweilig. Und ich möchte vermeiden, benutzerdefinierte Funktionen dafür zu erstellen.

Ich dachte an so etwas wie

COALESCE(a, 1) + COALESCE(b, 1) = 1 

aber solange a ist char - es verursacht Typ Fehleroperanden.

Also, irgendwelche tricky Lösungen?

+2

Wie wäre es 'COALESCE (a, b) = COALESCE (b, a)' :) Wird falschen Wert ergeben, wenn 'a = b'. http://www.sqlfiddle.com/#!1/9c33b/1 – mellamokb

+0

@mellamokb: verdient einen upvote, obwohl 'select coalesce (null, null) = coalesce (null, null)' gibt nicht boolean zurück (was zu Fehler in einigen Fällen) – zerkms

Antwort

25

Wenn Sie meinen genau ist NULL (die Ihre bestehende Logik entspricht), dann gilt:

a is null != b is null 
+2

+1 http://www.sqlfiddle.com/#!1/5199b/2 – mellamokb

+0

Überrascht war es so einfach :-) – zerkms

+0

@zerkms: Ich musste es doppelt überprüfen, daher die schnelle Löschung/undelete :) –

7

Und wenn Sie PostgreSQL verwenden, vergessen Sie nicht die Klammern ...

ALTER TABLE "schema"."table" ADD CHECK ((key1 IS NULL) <> (key2 IS NULL)); 

(ich verbrachte fast 10 Minuten versuchen, zu verstehen, was mit meiner Check falsch war.)