2012-12-05 4 views
5

Ich erstelle eine Einschränkung für eine (Microsoft) Sql Server 2008-Tabelle. Ich habe zwei Spalten, die unterschiedliche Datentypen haben. Eine Spalte muss immer Null sein, aber nicht beide (ein logisches exklusives ODER/XOR). Ich habe momentan einen funktionierenden Ausdruck.SQL Server Null Logisch XOR

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

Meine Frage ist Gibt es einen Reiniger oder kürzerer Weg, um diesen Code zu schreiben?

es testen Sie diesen Code verwenden können ...

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

Dies ist Microsoft SQL Server, nicht postgresql. Die Syntax unterstützt nicht "! =". –

Antwort

5

würde ich

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

bevorzugen Es ist ein wenig klarer meiner Meinung nach

+0

Beat mich zu einem fast identischen Beitrag von 30 Sekunden. ;-) – Mark

+0

@SQLMenace +1. Danke, dass du meinen Fehler ohne Downvoting aufgezeigt hast. – Kaf

2

OK, hier ist ein (wenn auch blöd) Vorschlag, wenn Sie mit allen Strings arbeiten. Und es skaliert zu Vielfachen größer als 2, wo Sie eine bestimmte Anzahl von Nicht-Nullen wünschen. Auch hier kürzer seine dumm und nicht wirklich, aber es war auch viel Spaß zu erwähnen zu verzichten ...

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

Um es mit Ihren Sachen machen zu arbeiten, würden Sie haben die [int] CAST, nehme ich an. String "Operation" in der Where-Klausel vor dem Abgleich tun ist böse und wahrscheinlich real langsam. Aber wenn Sie 6 Spalten hätten und genau 1 brauchen, um nicht-null zu sein, würde dieser Trick größer werden.

Im Grunde verwenden wir LEN, um die Nicht-Nullen zu zählen. Die +'x' stellt sicher, dass Sie eine '' nicht als null zählen. Sie könnten das beim Testen von [char] -Spalten auslassen.