我在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。
答案 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>