2011-02-26 29 views
25

我在很簡單的事情上掙扎。我試圖將布爾表達式的結果賦值給BIT變量。在TSQL中,如何評估表達式並將其分配給BIT字段?

基本上我想這樣做:

DECLARE @is_search_term_empty BIT 

SET @is_search_term_empty = (@search_term = '') 

其中@search_term是在代碼中聲明在其他什麼地方NVARCHAR(128)

我不能工作的語法來評價的東西,把它分配給一個變量BIT,即:

SET @is_search_term_empty = (1 > 2) 

感謝。

回答

23

您可以用CASE語句來做到這一點:

DECLARE @bitvar BIT 
DECLARE @search_term varchar(128) 

set @search_term = 'abc' 

SET @bitvar = CASE 
       WHEN (@search_term = 'abc') THEN 1 
       ELSE 0 
       END 

select @bitvar 
+4

我想了一下使用CASE聲明的第二個,但我很快就認爲這是一個討厭的黑客! :P(是我還是SQL語法有時是如此奇怪)無論如何,感謝您的幫助! :-) – 2011-02-26 13:02:17

+3

將這個老的,接受的答案downvoter請留下評論。謝謝。 – 2011-07-24 00:01:40

2

您可以簡單地設置一個默認值bit變量則只是應用IF聲明它是這樣的:

DECLARE @bitvar BIT = 0     -- << Default value 
DECLARE @search_term varchar(128) 

set @search_term = 'abc' 
IF (@search_term = 'abc') SET @bitvar = 1 -- << Value changes if required 

select @bitvar 
1

從SQL 2012開始,您現在可以使用IIf()函數。你的例子現在看起來像;

DECLARE @is_search_term_empty BIT = IIf(@search_term = '', 1, 0); 

這實際上仍然是一個CASE語句,但更容易消化。

0

這很難做的一個原因是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列是可空的。同樣,如果你希望避免三值布爾邏輯,你必須確保你的表達式輸入都不能爲空。