sql查询中case语句中的布尔值

sql查询中case语句中的布尔值,sql,ado.net,Sql,Ado.net,我在selectquery中使用case语句 Select col1, col2, isActive = case when col3 = 'abc' then 1 else 0 end, col4 from <tablename> where <some condition>. 我得到类型转换错误。因为它返回的值是int 如果我将查询更改为 Select col1, col2, isActive = case when col3 = 'abc' then 'tru

我在selectquery中使用case语句

Select col1, col2, isActive = case when col3 = 'abc' then 1  else  0 end, col4
from <tablename> where <some condition>.
我得到类型转换错误。因为它返回的值是int

如果我将查询更改为

Select col1, col2, isActive = case when col3 = 'abc' then 'true' else 'false' end, col4
from <tablename> where <some condition>.
你知道怎么处理吗

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

您可以执行以下操作:

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>
按预期工作

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

您可以执行以下操作:

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>
按预期工作

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

另一个选项:

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是多语句,并且需要多次引用变量,则可能会很有用。

另一个选项:

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是多语句并且您会多次引用变量时,可能会很有用。

布尔值的正确字符串值为“True”和“False”,因此请在查询中使用:

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

布尔值的正确字符串值为“True”和“False”,因此请在查询中使用:

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

您是否尝试过使用Convert.ToBoolean而不是显式强制转换?@Waqas是的,我可以将值读取为字符串并执行Convert.ToBooleam。它对我有用。但是我想将值读取为布尔值,而不是进行布尔转换。您是否尝试过使用Convert.ToBoolean而不是显式强制转换?@Waqas是的,我可以将值读取为字符串并执行Convert.ToBooleam。它对我有用。但我想读取布尔值,而不是进行布尔转换。我可以读取int或string值,然后进行布尔转换。但是我想知道为什么我不能直接读bool。我使用的是mssqlserver。是,在查询中转换将起作用。谢谢。但是为什么我们不需要这样做呢?因为除了使用CAST或CONVERT之外,我们没有办法指定“bit”类型的文本。我相信我可以将值读取为int或string,然后将其转换为boolean。但是我想知道为什么我不能直接读bool。我使用的是mssqlserver。是,在查询中转换将起作用。谢谢。但是为什么我们不需要这样做呢?因为我相信除了使用CAST或CONVERT之外,我们无法指定“bit”类型的文本。