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语句中的布尔值的主要内容,如果未能解决你的问题,请参考以下文章

where 子句中的 case 语句 - SQL Server

SQL CASE 语句和减号

条件语句&CASE表达式语法

SQL Case 语句中的两个值相减

如何使用 SQL 中的 Case 语句将数据插入临时表

Doctrine查询Builder case语句会抛出意外的语法错误