Làm cách nào để truyền một số nguyên thành boolean trong mệnh đề MySQL SELECT?


29

Tôi mới ở đây nên tử tế với tôi. Tôi có kịch bản sau đây:

Tôi có nhiều bảng, vì mục đích đơn giản, được thể hiện trong Chế độ xem trong cơ sở dữ liệu MySQL của tôi. Vấn đề của tôi là tôi cần một giá trị trong khung nhìn này đại diện nếu nó là một loại sự kiện hoặc một loại khác (một boolean đơn giản), mà tôi đã cố gắng đạt được với:

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

Kết quả được biểu diễn dưới dạng int và được Entity Framework đọc. Vấn đề là tôi thực sự cần một giá trị trả về boolean, mà tôi đã cố gắng đạt được với:

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

Điều này dẫn đến một lỗi, một lỗi không được hiển thị cho tôi trong MySQL Workbench (Tôi chỉ nhận được sự phiền toái đó "Bạn có lỗi trong ...").

Các bạn có thể vui lòng giúp tôi không?

Đã thử giải quyết nó trong ứng dụng của tôi, nhưng tôi thực sự muốn giải quyết vấn đề này trong cơ sở dữ liệu, vì nó sẽ được sử dụng bởi các phần mềm khác sau này.

Câu trả lời:


26

Hãy thử sử dụng hàm IF:

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

hoặc là

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

Ngay cả khi không có chức năng IF, vẫn chạy

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

mysql>

mang lại 0 hoặc 1 bằng cách sử dụng máy khách mysql

Vấn đề là ở đây: CAST ()CONVERT () chỉ có thể chấp nhận và trả về các loại sau :

  • SỐ LƯỢNG [(N)]
  • CHAR [(N)]
  • NGÀY
  • NGÀY GIỜ
  • QUYẾT ĐỊNH [(M [, D])]
  • Đã ký [INTEGER]
  • THỜI GIAN
  • KHÔNG ĐƯỢC KÝ [INTEGER]

Vì BOOLESE không có trong danh sách này, nó không bao giờ có thể được trả lại bằng CAST hoặc CHUYỂN ĐỔI

Bạn có thể sử dụng hàm IF để tạo chuỗi

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

1
Boolean là một bí danh cho tinyint. Trong mọi trường hợp không IFtrả lại tinyintvì vậy tôi không thể thấy câu trả lời này đúng hay được chấp nhận.
Evan Carroll

@EvanCarroll Câu trả lời của tôi có nghĩa là bỏ qua CAST và CHUYỂN ĐỔI hoàn toàn..Sử dụng hàm IF thực hiện những gì khuôn khổ của anh ấy sẽ không làm, đó là nhận ra BOOLESE là INT (4 byte) thay vì TINYINT (1 byte). Trong trường hợp này, bạn đã đổ lỗi cho khung không hoạt động với các giá trị BOOLESE.
RolandoMySQLDBA

10

Bạn có thể thực hiện theo cách rất đơn giản mà không cần sử dụng câu lệnh IF () dự phòng:

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

Thành thật mà nói đây là cách dễ nhất. Và làm việc cho trường hợp của tôi. Cảm ơn!
Mike Harrison

4

Bạn cũng có thể thử cưỡng chế boolean cổ điển:

CHỌN KHÔNG KHÔNG (bất cứ điều gì);

Điều tốt về điều này là nó bảo tồn tự nhiên các NULL, trong khi hầu hết các câu trả lời ở đây thì không.

Nếu bạn muốn ép buộc NULL thành FALSE, thì hãy làm

CHỌN IFNULL (KHÔNG PHẢI (bất cứ điều gì), FALSE);


1
Tôi tự hỏi, làm thế nào để đạt được việc chuyển đổi một số nguyên sang boolean?
ypercubeᵀᴹ

2

Bạn cũng có thể sử dụng "TRƯỜNG HỢP":

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


Bạn nên chọn nó là boolean, nếu không nó là một trường char.
McNets

Tuy nhiên, đôi khi người tiêu dùng truy vấn của bạn muốn có một ký tự
Eric Wilson

2

Điều này hiện không thể.

  • MySQL không có BOOLEANkiểu thực , (hoặc kiểu mảng thực .. hoặc kiểu JSON thực). Nó có một bí danh cho TINYINT.
  • Bất kỳ điều kiện trả về một số nguyên. Đây là kiểu dữ liệu nhanh nhất cho CPU và có lẽ chi tiết triển khai này được phản ánh ở đây. Ví dụ, 'true' IS TRUE1=1cả hai trả về 1như một int.
  • CAST không cung cấp một TINYINTđịnh dạng.

Theo như tôi có thể nói với bạn, bạn không thể hạ cấp một loại, cũng không tạo ra một mảnh nhỏ trong a SELECT.

Tôi rất muốn đề xuất chuyển sang PostgreSQL. Nó ít đáng sợ hơn ... và giải phóng.


2

Sử dụng chức năng mysql CAST_TO_BIT

Ví dụ:

SELECT CAST_TO_BIT(1);

Mysql: CHỌN CAST_TO_BIT (0) ; -> Trình điều khiển jdbc -> Java: Boolean false ;

Mysql: CHỌN CAST_TO_BIT (1) ; -> Trình điều khiển jdbc -> Java: Boolean true ;

Mysql: CHỌN CAST_TO_BIT (NULL) ; -> trình điều khiển jdbc -> Java: NULL ;

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.