2012-12-05 74 views
5

我在(Microsoft)Sql Server 2008表上創建約束。我有兩列是不同的數據類型。一列必須始終爲空,但不能同時爲空(A邏輯異或/異或)。我目前有一個工作表達。SQL Server空邏輯異或

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

我的問題是是否有清潔劑或寫這段代碼更短呢?

爲了測試它,你可以使用此代碼...

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

這是Microsoft SQL Server,不是postgresql。該語法不支持「!=」。 –

回答

5

我寧願

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

這是在我看來更清晰一點

+0

擊敗我幾乎相同的職位30秒。 ;-) – Mark

+0

@SQLMenace +1。謝謝你指出我的錯誤,而不是downvoting。 – Kaf

2

OK,這裏是一個(儘管愚蠢),如果你正在處理所有字符串的建議。如果您想要特定數量的非空值,它會縮放到大於2的倍數。同樣,在其笨,而不是真正短,但它太貪玩錯過提...

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

,使其與你的東西的工作,你不得不投[INT],我想。在匹配之前在where子句中進行字符串「手術」是邪惡的,並且很可能非常緩慢。但是如果你有6列,只需要1個就不是null,這個技巧就會擴大。

基本上,我們使用LEN來計算非空值。 +'x'可確保您不會將''計爲空。測試[char]列時,可以將其關閉。