我是新来的,所以对我好一点。我有以下情形:

我有很多表,为了简单起见,在我的MySQL数据库中以视图的形式表示。我的问题是,在此视图中我需要一个值来表示它是一种事件还是另一种(简单的布尔值),我尝试通过以下方法来实现:

`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement` AS `IsStopingEvent`


结果表示为int,因此由Entity Framework读取。问题是我真的需要一个布尔返回值,我试图通过以下方法来实现:

CAST((`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement`) as boolean) AS `IsStopingEvent` 


这导致了错误,该错误在我中未显示MySQL Workbench(我只收到令人烦恼的“您在...中有错误”)。应用程序,但我真的很想在数据库中解决此问题,因为稍后它将被其他软件使用。

#1 楼

尝试使用IF函数:

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, TRUE, FALSE) 
FROM ...




SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, 1, 0) 
FROM ...


即使没有IF函数,也运行

mysql> select ('rolando' = 'rolando') str_compare;
+-------------+
| str_compare |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

mysql>


使用mysql客户端产生0或1

问题是这样的:CAST()和CONVERT()只能接受并返回以下内容类型:


BINARY [(N)]
DATE
DATETIME
签名的[INTEGER]
时间
未签名的[INTEGER]

由于BOOLEAN不在此列表中,所以CAST或CONVERT永远不能返回它

您可以使用IF函数生成字符串

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, 'TRUE', 'FALSE') 
FROM ...


评论


布尔值是tinyint的别名。在任何情况下,IF都不会返回tinyint,因此我看不到这个答案是正确的还是被接受的。

–埃文·卡洛尔(Evan Carroll)
17年12月11日在8:06

@EvanCarroll我的回答是完全绕开CAST和CONVERT。使用IF函数可完成他的框架无法完成的工作,即将BOOLEAN识别为INT(4字节)而不是TINYINT(1字节)。在这种情况下,您应该责怪该框架不使用BOOLEAN值。

– RolandoMySQLDBA
17年12月11日在13:33

#2 楼

您可以非常简单地完成此操作,而无需使用冗余的IF()语句:

... `YourField` IS NOT NULL AS `YourField` ...


评论


老实说,这是最简单的方法。并适合我的情况。谢谢!

–麦克·哈里森(Mike Harrison)
19年8月12日在16:36

#3 楼

您也可以尝试经典的布尔强制:

SELECT NOT NOT(无论如何);

这样做的好处是它自然保留了NULL,而此处的大多数答案

如果要强制将NULL强制为FALSE,请执行

选择IFNULL(不要(无论如何),FALSE);

评论


我想知道,这如何实现将整数转换为布尔值?

–超立方体ᵀᴹ
17/12/17在15:12



#4 楼

您还可以使用“ CASE”:

SELECT CASE WHEN yourField=testValue THEN 'TRUE' ELSE 'FALSE' END as boolFieldName

评论


您应该将其强制转换为布尔值,如果不是,则为char字段。

– McNets
17年11月10日14:37

有时候,查询的使用者想要一个字符,尽管

–埃里克·威尔逊(Eric Wilson)
19-10-11的18:00

#5 楼


使用mysql函数CAST_TO_BIT

示例:


SELECT CAST_TO_BIT(1);



Mysql:SELECT CAST_TO_BIT(0) ; -> jdbc驱动程序-> Java:布尔型false;

Mysql:SELECT CAST_TO_BIT(1); -> jdbc驱动程序-> Java:布尔值true;

Mysql:SELECT CAST_TO_BIT(NULL); -> jdbc驱动程序-> Java:NULL;


#6 楼

目前这是不可能的。


MySQL没有真正的BOOLEAN类型(或真正的数组类型..或真正的JSON类型)。它具有TINYINT的别名。
任何条件都返回整数。这是CPU最快的数据类型,大概在此处反映了该实现细节。例如,'true' IS TRUE1=1都将1返回为int
CAST没有提供TINYINT格式。在SELECT中。

我强烈建议迁移到PostgreSQL。它是如此的可怕...解放了。

#7 楼

CAST(IF(col_name = 1, 'true', 'false') AS JSON)可能适用于某些用例。

从MySQL 5.7.8开始,支持RFC 7159定义的本机JSON数据类型。对于我的用例,我有一个INT列,该列始终为0或1,但我需要将输出作为bool truefalse而不是字符串“ true”或“ false”。

https://dev.mysql.com/doc/refman/5.7/en/json .html#json-converting-between-types