我有很多表,为了简单起见,在我的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 ...
#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 TRUE
和1=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 true
或false
而不是字符串“ true”或“ false”。https://dev.mysql.com/doc/refman/5.7/en/json .html#json-converting-between-types
评论
布尔值是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