2012-12-05 9 views
5

Sto creando un vincolo su una tabella (Microsoft) Sql Server 2008. Ho due colonne che sono diversi tipi di dati. Una colonna deve essere nullo in ogni momento, ma non entrambe (Un OR/XOR logico esclusivo). Ho un'espressione lavorativa al momento.SQL Server Null Logical XOR

(@a is null or @b is null) and not (@a is null and @b is null) 

La mia domanda è C'è un detergente o un modo più breve per scrivere questo codice?

di provarlo è possibile utilizzare questo codice ...

declare @a int 
declare @b varchar(5) 

set @a=1 
set @b='XXXXX' 

if (@a is null or @b is null) and not (@a is null and @b is null) 
    select 'pass' 
else 
    select 'fail' 
+0

Questo è Microsoft SQL Server, non postgresql. La sintassi non supporta "! =". –

risposta

5

Io preferirei

if (@a is null and @b is not null) or (@a is not null and @b is null) 

E 'un po' più chiaro, a mio parere

+0

Batti un post quasi identico di 30 secondi. ;-) – Mark

+0

@SQLMenace +1. grazie per aver segnalato il mio errore senza downvoting. – Kaf

2

OK, ecco un (anche se stupido) suggerimento se stai lavorando con tutte le stringhe. E scala a multipli superiori a 2 dove si desidera un determinato numero di non null. Ancora una volta, la sua stupida e non realmente più breve, ma era troppo divertente per passare in su di nota ...

where LEN(ISNULL(right(@a+'x',1),'')+ISNULL(right(@b+'x',1),'')) = 1 

per farlo funzionare con la vostra roba, Dovresti lanciare la [int], suppongo. Fare una "chirurgia" di spago nella clausola where prima dell'abbinamento è malvagio e potrebbe essere molto lento. Ma se avessi 6 colonne e avessi bisogno esattamente di 1 per essere non-null, questo trucco aumenterebbe.

Fondamentalmente, stiamo utilizzando LEN per contare i non null. Lo +'x' garantisce che non si contino uno '' come null. Puoi lasciarlo spento durante il test delle colonne [char].