sql查询中case语句中的boolean值

use*_*405 0 sql ado.net

我在select查询中使用case语句这样的东西.

Select col1, col2, isActive = case when col3 = 'abc' then 1  else  0 end, col4
from <tablename> where <some condition>.
Run Code Online (Sandbox Code Playgroud)

当我在ado.net中读取'isActive'列值时 -

bool isActiveFlag = (bool)datareader["isActive"];
Run Code Online (Sandbox Code Playgroud)

我得到了类型转换错误.因为它返回值为int.

如果我将查询更改为

Select col1, col2, isActive = case when col3 = 'abc' then 'true' else 'false' end, col4
from <tablename> where <some condition>.
Run Code Online (Sandbox Code Playgroud)

我得到相同的类型转换错误,因为此时返回的值是字符串.基本上我想查询在查询中为布局值'isActive'赋值,这样我就可以把它读作布尔值.

bool isActiveFlag = (bool)datareader["isActive"];
Run Code Online (Sandbox Code Playgroud)

知道怎么处理这个吗?

我不想将值读取为int或string,然后将值转换为boolean.

DeC*_*Caf 5

你可以这样做:

bool isActiveFlag = (int)datareader["isActive"] != 0;
Run Code Online (Sandbox Code Playgroud)

您没有提到您正在使用哪些dbms,但如果SQL Server可以执行以下操作:

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

这应该作为一个bool制作返回你的价值

bool isActiveFlag = (bool)datareader["isActive"];
Run Code Online (Sandbox Code Playgroud)

按预期工作.

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