這很難做的一個原因是T-SQL使用三值布爾邏輯。 TRUE和FALSE不是唯一的選擇;還有UNKNOWN。我們有一個與NULL值相似的概念,並且存在大量語言功能可以將值從值轉換爲布爾表達式(=
,IS NULL
,IS NOT NULL
等),但是不存在IS UNKNOWN
或其他語言功能直接從布爾表達式轉換爲位數據類型。
下面是一個示例解決方案。不幸的是這需要您正在測試的表達式(1 = NULL
,這裏)需要的代碼被複制 - 你可以與sp_executesql的輸出參數,避免這種情況,如果你真的需要:
DECLARE @bit1 bit = 0,
@bit2 bit = 0,
@result bit;
IF (1 = NULL) SET @bit1 = 1;
IF NOT(1 = NULL) SET @bit2 = 1;
IF @bit1 = @bit2 SET @result = NULL;
ELSE IF @bit1 = 1 SET @result = 1;
ELSE IF @bit2 = 1 SET @result = 0;
SELECT @result as [bit];
這個例子依賴於這樣的事實NOT(UNKNOWN)返回UNKNOWN,而不是TRUE。這顯然依賴於你的BIT列是可空的。同樣,如果你希望避免三值布爾邏輯,你必須確保你的表達式輸入都不能爲空。
我想了一下使用CASE聲明的第二個,但我很快就認爲這是一個討厭的黑客! :P(是我還是SQL語法有時是如此奇怪)無論如何,感謝您的幫助! :-) – 2011-02-26 13:02:17
將這個老的,接受的答案downvoter請留下評論。謝謝。 – 2011-07-24 00:01:40