วิธีการแปลงจำนวนเต็มเป็นบูลีนในประโยค MySQL SELECT?


29

ฉันใหม่ที่นี่ดังนั้นโปรดฉัน ฉันมีสถานการณ์ต่อไปนี้:

ฉันมีหลายตารางซึ่งเพื่อความเรียบง่ายจะถูกแสดงในมุมมองในฐานข้อมูล MySQL ของฉัน ปัญหาของฉันคือฉันต้องการค่าในมุมมองนี้แสดงว่าเป็นเหตุการณ์ประเภทหนึ่งหรืออื่น (บูลีนที่เรียบง่าย) ซึ่งฉันพยายามที่จะบรรลุด้วย:

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

ผลลัพธ์ถูกแสดงเป็น int และดังนั้นถูกอ่านโดย Entity Framework ปัญหาคือฉันต้องการค่าบูลีนคืนซึ่งฉันพยายามทำด้วย:

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

สิ่งนี้ส่งผลให้เกิดข้อผิดพลาดข้อหนึ่งที่ไม่ปรากฏให้ฉันเห็นใน MySQL Workbench (ฉันได้รับเฉพาะที่น่ารำคาญ "คุณมีข้อผิดพลาดใน ... ")

พวกคุณช่วยฉันออกมาได้ไหม

พยายามที่จะแก้ปัญหาในแอปพลิเคชันของฉัน แต่ฉันจริง ๆ preffer นี้แก้ไขได้ในฐานข้อมูลเพราะมันจะถูกใช้โดยซอฟต์แวร์อื่น ๆ ในภายหลัง

คำตอบ:


26

ลองใช้ฟังก์ชัน 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>

ให้ผลลัพธ์ 0 หรือ 1 โดยใช้ไคลเอนต์ mysql

ปัญหาคือ: CAST ()และCONVERT () สามารถยอมรับและส่งกลับประเภทต่อไปนี้เท่านั้น :

  • BINARY [(N)]
  • CHAR [(N)]
  • วันที่
  • วันเวลา
  • ทศนิยม [(M [D])]
  • ลงชื่อแล้ว [จำนวนเต็ม]
  • เวลา
  • ไม่ได้ลงนาม [INTEGER]

เนื่องจาก BOOLEAN ไม่อยู่ในรายการนี้จึงไม่สามารถส่งคืนโดย CAST หรือ CONVERT

คุณสามารถใช้ฟังก์ชัน IF เพื่อสร้างสตริง

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

1
tinyintบูลีนเป็นนามแฝงสำหรับ ไม่ว่าในกรณีใด ๆ จะไม่IFส่งคืนtinyintดังนั้นฉันจึงไม่สามารถดูได้ว่าคำตอบนี้ถูกต้องหรือไม่
Evan Carroll

@EvanCarroll คำตอบของฉันหมายถึงการข้าม CAST และ CONVERT ไปพร้อมกันโดยใช้ฟังก์ชัน IF ทำสิ่งที่เฟรมเวิร์กของเขาไม่ทำซึ่งยอมรับว่าบูลีนเป็น INT (4 ไบต์) แทนที่จะเป็น TINYINT ในกรณีนี้คุณได้ตำหนิกรอบที่ไม่ทำงานกับค่าบูลีน
RolandoMySQLDBA

10

คุณสามารถทำได้ง่ายๆโดยไม่ต้องใช้คำสั่ง IF () ซ้ำซ้อน:

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

สุจริตนี่เป็นวิธีที่ง่ายที่สุด และทำงานให้กับกรณีของฉัน ขอบคุณ!
Mike Harrison

4

นอกจากนี้คุณยังสามารถลองใช้การบังคับบูลีนแบบคลาสสิก:

เลือกไม่ (อะไรก็ตาม);

สิ่งที่ดีเกี่ยวกับเรื่องนี้ก็คือมันรักษา NULLs ตามธรรมชาติในขณะที่คำตอบส่วนใหญ่ไม่ได้ทำ

ถ้าคุณต้องการบังคับ NULL ให้เป็น FALSE ให้ทำ

เลือก IFNULL (ไม่ไม่ (ไม่ว่าจะเป็นอะไร) เท็จ);


1
ฉันสงสัยว่าสิ่งนี้ประสบความสำเร็จในการแปลงจำนวนเต็มเป็นบูลีนได้อย่างไร
ypercubeᵀᴹ

2

คุณสามารถใช้ "CASE":

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


คุณควรโยนมันเป็นบูลีนถ้าไม่ใช่มันเป็นทุ่งถ่าน
McNets

บางครั้งผู้บริโภคในแบบสอบถามของคุณต้องการตัวละคร
Eric Wilson

2

ปัจจุบันนี้เป็นไปไม่ได้

  • MySQL ไม่มีBOOLEANประเภทจริง(หรือประเภทอาร์เรย์จริง .. หรือชนิด JSON จริง) TINYINTมันมีนามแฝงสำหรับ
  • เงื่อนไขใด ๆ คืนค่าจำนวนเต็ม นี่เป็นประเภทข้อมูลที่เร็วที่สุดสำหรับ CPU และสันนิษฐานว่ารายละเอียดการใช้งานนี้จะแสดงที่นี่ ยกตัวอย่างเช่น'true' IS TRUEและ1=1ทั้งสองกลับมาในฐานะที่เป็น1int
  • นักแสดงไม่ได้จัดTINYINTรูปแบบ

เท่าที่ผมสามารถบอกคุณไม่สามารถลดระดับประเภทหรือผลิต TINYINT SELECTในที่

ฉันอยากจะแนะนำอย่างมากให้ทำการโยกย้ายไปยัง PostgreSQL มันช่างน่ากลัวน้อยกว่ามาก ... และปลดปล่อย


2

ใช้ฟังก์ชั่น mysql CAST_TO_BIT

ตัวอย่าง:

SELECT CAST_TO_BIT(1);

Mysql:เลือกCAST_TO_BIT (0) ; -> ไดรเวอร์ JDBC -> Java:บูลีนเท็จ ;

Mysql:เลือกCAST_TO_BIT (1) ; -> ไดรเวอร์ jdbc -> Java: Boolean จริง ;

Mysql:เลือกCAST_TO_BIT (NULL) ; -> ไดรเวอร์ jdbc -> Java: NULL ;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.