2012-04-18 14 views
12

Ho 2 colonne nullable CHAR e ho bisogno di controllare se solo uno di loro è nullo.XOR logico ingannevole per valori nullable

Facendo

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

è noioso. E vorrei evitare di creare funzioni personalizzate per questo.

Stavo pensando a qualcosa di simile

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

ma finché a è char - è causa l'errore tipo di operando.

Quindi, qualsiasi ingannevole soluzioni?

+2

ne dite 'COALESCE (a, b) = COALESCE (b, a)' :) produrrà valore errato se 'a = b'. http://www.sqlfiddle.com/#!1/9c33b/1 – mellamokb

+0

@mellamokb: merita un upvote, anche se 'select coalesce (null, null) = coalesce (null, null)' non restituisce booleano (che potrebbe portare a errori in alcuni casi) – zerkms

risposta

25

Se vuoi dire esattamente uno è NULL (che corrisponde al tuo logica esistente), quindi:

a is null != b is null 
+2

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

+0

Sorpreso che fosse così semplice :-) – zerkms

+0

@zerkms: ho dovuto ricontrollarlo, quindi la cancellazione rapida/undelete :) –

7

E se si sta utilizzando PostgreSQL non dimenticare le parentesi ...

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

(ho passato quasi 10 minuti cercando di capire cosa era sbagliato con il mio assegno.)