2011-09-11 62 views
0

我在select查詢中使用case語句有點像這樣。sql查詢中的case語句中的布爾值

Select col1, col2, isActive = case when col3 = 'abc' then 1 else 0 end, col4 
from <tablename> where <some condition>. 

當我看到在ado.net的 'isActive' 列的值 -

bool isActiveFlag = (bool)datareader["isActive"]; 

我得到類型轉換錯誤。因爲它以int的形式返回值。

如果我更改查詢

Select col1, col2, isActive = case when col3 = 'abc' then 'true' else 'false' end, col4 
from <tablename> where <some condition>. 

我得到同樣的類型轉換錯誤,因爲這時候返回的值是字符串。基本上我想要查詢分配布爾值到'isActive'在查詢中,以便我可以讀取它作爲布爾值。

bool isActiveFlag = (bool)datareader["isActive"]; 

任何想法如何處理這個?

我不想讀取作爲int或字符串的值,然後將值轉換爲布爾值。

+0

你嘗試使用,而不是明確的鑄造Convert.ToBoolean? – Waqas

+0

@Waqas是的,我可以讀取值作爲字符串,並做Convert.ToBooleam。它爲我工作。但我想讀取值作爲布爾值而不是做布爾轉換。 – user936405

回答

5

你可以這樣做:

bool isActiveFlag = (int)datareader["isActive"] != 0; 

你沒有提到這DBMS您使用,但如果SQL Server,你可以這樣做:

Select col1, col2, isActive = CONVERT(bit, case when col3 = 'abc' then 1 else 0 end), col4 from <tablename> where <some condition> 

應該返回自己的價值作爲布爾製作

bool isActiveFlag = (bool)datareader["isActive"]; 

按預期工作。

如果我沒有弄錯,這是因爲SQL服務器本身沒有布爾數據類型,所以沒有辦法在查詢中指定布爾文字。 .NET將位數據類型映射爲布爾值,但也無法在不使用CONVERT或CAST的情況下在查詢字符串中指定位字面值。正如你已經看到的那樣,文字1被解釋爲一個int值。

+0

我可以讀取值作爲整數或字符串,並做轉換爲布爾值。但我想知道爲什麼我不能直接讀爲布爾。 – user936405

+0

答案更新了更多的信息。 – DeCaf

+0

我正在使用MS Sql服務器。是查詢中的CONVERT將起作用。謝謝,但爲什麼我們需要這樣做? – user936405

1

另一種選擇:

declare @true bit = 1 
declare @false bit = 0 

Select col1, col2, isActive = case when col3 = 'abc' then @true else @false end, col4 
from <tablename> where <some condition> 

可能是矯枉過正在這種情況下,但是當你的SQL是多語句,你會多次引用變量可能是有用的。

1

boolean的正確字符串值是「真」和「假」,所以在您的查詢中使用:

Select col1, col2, isActive = case when col3 = 'abc' then 'True' else 'False' end, col4 
from <tablename> where <some condition>