【问题标题】:boolean value in case statement in sql querysql查询中case语句中的布尔值
【发布时间】: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。它对我有用。但我想将该值读取为布尔值而不是进行布尔转换。

标签: sql ado.net


【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 2022-06-21
      相关资源
      最近更新 更多