2012-04-18 10 views
12

Mam 2 kolumny zerowe CHAR i muszę sprawdzić, czy tylko jeden z nich ma wartość null.Tricky logiczny XOR dla wartości zerowalnych

Doing

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

jest nudny. I chciałbym uniknąć tworzenia niestandardowych funkcji do tego.

Myślałam o czymś jak

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

ale dopóki a jest char - powoduje błąd typu argumentu.

Więc, jakieś podchwytliwe rozwiązania?

+2

Jak o 'COALESCE (a, b) = COALESCE (b, a)' :) przyniesie nieprawidłową wartość, jeśli 'a = b'. http://www.sqlfiddle.com/#!1/9c33b/1 – mellamokb

+0

@mellamokb: zasługuje na awans, chociaż 'wybierz koalescencję (null, null) = koalescytacja (null, null)' zwraca nie boolean (co może prowadzić do błędy w niektórych przypadkach) – zerkms

Odpowiedz

25

Jeśli masz na myśli dokładnie nich jest NULL (który pasuje do istniejącej logiki), a następnie:

a is null != b is null 
+2

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

+0

Zaskoczyło to było takie proste :-) – zerkms

+0

@zerkms: Musiałem to sprawdzić dwukrotnie, stąd szybkie usuwanie/undelete :) –

7

A jeśli używasz PostgreSQL nie zapomnij nawiasy ...

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

(I spędził prawie 10 minut, próbując zrozumieć, co się stało z moim czekiem.)