sql查询中case语句中的boolean值

时间:2011-09-11 06:30:26

标签: sql ado.net

我在select查询中使用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或string,然后将值转换为boolean。

3 个答案:

答案 0 :(得分: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制作

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

按预期工作。

如果我没弄错,这是因为SQL server per-se没有布尔数据类型,所以无法在查询中指定布尔文字。 .NET将位数据类型映射到bool,但是如果不使用CONVERT或CAST,也无法在查询字符串中指定位字符。文字1被解释为你已经看到的int值。

答案 1 :(得分: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是多语句并且你会多次引用变量时,这可能很有用。

答案 2 :(得分:1)

布尔值的正确字符串值是&#39; True&#39;并且&#39; False&#39;,请在查询中使用:

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