2010-06-22 107 views
4

我發現很奇怪,像這樣簡單的代碼是無效的:有沒有辦法在不使用SQL Server強制轉換的情況下獲得布爾值?

select * from table where field=true 

替代顯然是

select * from table where field='true' 

好吧,想我可以忍受的。因爲我需要最近這樣做或那樣的原因:

select true as somefield,... 

另一種方法來獲得類型和一切權利是更難看,但:

select cast('true' as bit) as somefield,... 

我缺少的東西?實際上是否有一些內置的方式來獲得true或false的值作爲布爾值而不用轉換?

回答

6

SQL Server不具有布爾數據類型,你可以在表中存儲,但它確實包含一個位數據類型可以存儲。

但是,您看到的true關鍵字是一個布爾值。 Sql Server僅爲其比較運算符的結果使用布爾數據類型,它可以返回三個值,TRUE,FALSE和UNKNOWN。

重要的是要知道兩者之間的區別。

SELECT * 
FROM Table 
WHERE Field = 1 --Field = true 

要將布爾值存儲在表中,請使用位數據類型。使用1 for true,0 for falseNull for unknown

3

使用1或0,假設您的字段是類型位。

select * from table where field=1 

select * from table where field=0 
16

位是TSQL中最常用來表示布爾值的數據類型。 我通常做這樣的事情

select CAST(1 as bit) as somefield 
4

我要添加到當前所有的答案,只是多了一個方法來獲取boolean沒有在SQL Server鑄造:

DECLARE @myTrue bit = 1; 
-- or two lines for old version of SQL Server 
-- DECLARE @myTrue bit; 
-- SET @myTrue = 1; 

SELECT @myTrue AS somefield 
6

值「真」和「假」是特殊字符串,可隱式轉換到類型位的變量。本摘錄來自MSDN documentation for bit。 TRUE和FALSE

字符串值可以被轉換爲比特值:TRUE被轉換爲1,而這些值似乎是不區分大小寫FALSE轉換到0

注。

這就是爲什麼你的第二個代碼片段中的where子句起作用(我假定該字段被定義爲一個位)。

select * from table where field='true'

不以任何方式指定位的目標類型,「TRUE」和「FALSE」不再被視爲特殊值,並保持簡單的字符串值。這就是爲什麼你的第三個片段需要演員。

select cast('true' as bit) as somefield,... 

MSDN states那個位文字(或常量作爲它們被稱爲有)是數字0和1

位常數由數字0或1表示的,並且不包含在引號。如果使用大於1的數字,則將其轉換爲1。

此信息可能有助於在某些情況下,但請注意文字值0和1被解釋爲整數而不是位。下面的語句都返回了'int'來說明這一點。

select sql_variant_property(0, 'BaseType') 
select sql_variant_property(1, 'BaseType') 
1

不是一個真正的答案,但...

恰好碰到了,我被迫使用位轉換的問題。那麼,'強迫'在這裏是一個'有點'的強詞...相反,我更喜歡使用BIT轉換。

我建了一個SQL查詢一個C#方法裏面,使用case語句,如:

case when foo = faa then 1 else 0 end as outcome 

,當結果被饋送到LINQ查詢,結果類型解析爲INT32。所以這個失敗:

outcome = s.Field<bool>("outcome") 

我想要的結果,解決到了一點,所以我代替使用:

cast(case when foo = faa then 1 else 0 end as bit) as outcome 

點是,雖然TSQL可能會認爲這是一個有點,而不是ADO沒有。

總的來說,我想我是說,不要依賴框架(.NET或TSQL)來做你的骯髒工作...如果你想要一個BIT,把它當作BIT來投入:)

相關問題