sql查询中case语句中的布尔值
Posted
技术标签:
【中文标题】sql查询中case语句中的布尔值【英文标题】:boolean value in case statement in sql query 【发布时间】:2011-09-11 06:30:26 【问题描述】:我在选择查询中使用 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,然后将值转换为布尔值。
【问题讨论】:
您是否尝试过使用 Convert.ToBoolean 而不是显式转换? @Waqas 是的,我可以将值读取为字符串并执行 Convert.ToBooleam。它对我有用。但我想将该值读取为布尔值而不是进行布尔转换。 【参考方案1】:你可以这样做:
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 Server 本身没有布尔数据类型,因此无法在查询中指定布尔文字。 .NET 将位数据类型映射为 bool,但也无法在不使用 CONVERT 或 CAST 的情况下在查询字符串中指定位文字。如您所见,文字 1
被解释为 int 值。
【讨论】:
我可以将值读取为 int 或 string 并转换为布尔值。但我想知道为什么我不能直接读为 bool。 我正在使用 MS Sql 服务器。是的,查询中的转换将起作用。谢谢。但是为什么我们不需要这样做呢? 因为我相信除了使用 CAST 或 CONVERT 之外,我们无法指定“位”类型的文字。【参考方案2】:另一种选择:
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 是多语句并且您会多次引用变量时可能有用。
【讨论】:
【参考方案3】:布尔值的正确字符串值是“True”和“False”,因此请在查询中使用:
Select col1, col2, isActive = case when col3 = 'abc' then 'True' else 'False' end, col4
from <tablename> where <some condition>
【讨论】:
以上是关于sql查询中case语句中的布尔值的主要内容,如果未能解决你的问题,请参考以下文章