2012-06-21 123 views
1

我知道SQL Server沒有布爾數據類型,最好的選擇是使用BIT數據類型。SQL Server布爾運算符

我的問題是什麼布爾表達式評估。例如,如果我有聲明

expr1 AND expr2 

,如果expr1的是真實的,表達式2是假的,他們做內部評估與值1和0的位?然後AND運算符檢查BIT?

我覺得這是不是這樣的,因爲那麼下面應該工作:

select 1 where 1 and 0 

因此,沒有SQL服務器內部有一個布爾數據類型?

以下工作

select 1 where 1 = 0 
select 1 where 1 = 0 and 0 = 0 

但這

select 1 where 1 and 0 

報告

消息4145,15級,狀態1,行 在指定的非布爾類型的表達式在'和'附近預期條件的上下文。

這意味着內部sql服務器將表達式視爲布爾值,但爲什麼不能訪問該數據類型。

+0

@米奇小麥,我不明白 – alfoks

+0

我沒有使用按位。你不明白我的問題。 – alfoks

+1

既然你不能*存儲*表達式評估的結果,也不能提供一個值來代替正在評估的值,那有什麼意義呢? –

回答

4

SQL Server確實有一個Boolean數據類型。您可以打開Logical Operators (Transact-SQL)手冊頁並找到以下聲明:

邏輯運算符測試某些條件的真實性。邏輯運算符(如比較運算符)返回值爲TRUE,FALSE或UNKNOWN的布爾型數據類型。

這只是您不能像使用其他Transact-SQL數據類型一樣使用此類型。例如,你不能聲明布爾變量或參數,向表中添加布爾列,從布爾值轉換爲/。但你可以有布爾表達式並在需要它們的上下文中使用它們(WHEREON,檢查約束...)。您還可以將布爾型運算符應用於以下表達式:AND,NOT等。 (如<=LIKE等運營商也可以考慮布爾值,在這個意義上,他們返回布爾結果,但它們的操作數實際上從未布爾)

因此,要總結,有一個布爾類型在SQL Server中,但其使用是有限的,如上所述。爲什麼?我的回答可能是一個愚蠢的人,對不起,但這是我滿意的一個:這是他們選擇它的方式。

+0

這就是我想出的。 – alfoks

0

邏輯運算符結果爲true或false。所以在你的例子中,如果expr1expr2爲真,你會得到一個結果。檢查它是否是你爲每個表達做的操作。

所以你比較一個類似於位值column_bit = 0的列,結果是true或false。 如果您的expr1爲true並且expr2爲false,則邏輯AND運算符的結果爲false。

編輯:

select 1 where 1 and 0不行,因爲你不使用一個比較操作。 1 = 1 AND 0 = 0可以工作,例如但它的廢話:)

+0

我明白你說什麼。我的問題是,sql服務器如何處理這些布爾值true,false,unknown。 – alfoks

+0

我知道它不能工作,爲什麼!看來我無法正確解釋我在問什麼! – alfoks

+0

好邏輯運算符處理每個操作的真/假,但是對於一個操作沒有「我是真/假佔位符」,所以你需要總是比較一些東西。 – YvesR