Bagaimana cara melemparkan integer ke boolean di klausa MySQL SELECT?

29

Saya baru di sini jadi baiklah kepada saya. Saya memiliki skenario berikut:

Saya punya banyak tabel yang, demi kesederhanaan, diwakili dalam Tampilan di database MySQL saya. Masalah saya adalah bahwa saya memerlukan nilai dalam pandangan ini yang mewakili jika itu adalah salah satu jenis peristiwa (boolean sederhana), yang saya coba capai dengan:

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

Hasilnya direpresentasikan sebagai int, dan dibaca oleh Entity Framework. Masalahnya adalah bahwa saya benar-benar membutuhkan nilai pengembalian boolean, yang saya coba capai dengan:

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

Ini menghasilkan kesalahan, salah satu yang tidak ditampilkan kepada saya di MySQL Workbench (saya hanya menerima bahwa "Anda memiliki kesalahan dalam ...").

Bisakah kalian tolong bantu saya?

Mencoba menyelesaikannya dalam aplikasi saya, tapi saya lebih suka ini diselesaikan dalam database, karena akan digunakan oleh perangkat lunak lain nanti.

Bruno
sumber

Jawaban:

26

Coba gunakan fungsi IF:

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

atau

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

Bahkan tanpa fungsi IF, berjalan

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

mysql>

hasilkan 0 atau 1 menggunakan klien mysql

Masalahnya adalah ini: CAST () dan CONVERT () hanya dapat menerima dan mengembalikan jenis-jenis berikut :

  • BINARY [(N)]
  • CHAR [(N)]
  • TANGGAL
  • TANGGAL WAKTU
  • DECIMAL [(M [, D])]
  • DITANDATANGANI [INTEGER]
  • WAKTU
  • TIDAK TANDA [INTEGER]

Karena BOOLEAN tidak ada dalam daftar ini, BOOLEAN tidak dapat dikembalikan oleh CAST atau CONVERT

Anda bisa menggunakan fungsi IF untuk menghasilkan string

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, 'TRUE', 'FALSE') 
FROM ...
RolandoMySQLDBA
sumber
1
Boolean adalah alias untuk tinyint. Dalam keadaan apa pun tidak IFmengembalikan tinyintjadi saya tidak bisa melihat bagaimana jawaban ini benar atau diterima.
Evan Carroll
@EvanCarroll Jawaban saya dimaksudkan untuk memotong CAST dan CONVERT sama sekali .. Menggunakan fungsi IF melakukan apa yang tidak akan dilakukan kerangka kerjanya, yang mengenali BOOLEAN sebagai INT (4-byte) daripada TINYINT (1-byte). Dalam hal ini, Anda menyalahkan kerangka kerja karena tidak bekerja dengan nilai-nilai BOOLEAN.
RolandoMySQLDBA
10

Anda dapat melakukannya dengan cara yang sangat sederhana, tanpa menggunakan pernyataan IF () yang berlebihan:

... `YourField` IS NOT NULL AS `YourField` ...
Roman Newaza
sumber
Jujur ini adalah cara termudah. Dan bekerja untuk kasus saya. Terima kasih!
Mike Harrison
4

Anda juga dapat mencoba paksaan boolean klasik:

PILIH BUKAN (apa pun);

Hal yang baik tentang ini adalah bahwa ia secara alami memelihara NULLs, sedangkan sebagian besar jawaban di sini tidak.

Jika Anda ingin memaksa NULL ke FALSE, maka lakukan

PILIH IFNULL (BUKAN TIDAK (apa pun), SALAH);

poseidonCore
sumber
1
Saya bertanya-tanya, bagaimana hal ini dapat mengkonversi bilangan bulat menjadi boolean?
ypercubeᵀᴹ
2

Anda juga dapat menggunakan "CASE":

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

Zvezdochka
sumber
Anda harus melemparkannya sebagai boolean, jika bukan itu adalah bidang char.
McNets
Kadang-kadang konsumen permintaan Anda menginginkan karakter,
Eric Wilson
2

Saat ini tidak mungkin.

  • MySQL tidak memiliki BOOLEANtipe nyata , (atau tipe array nyata .. atau tipe JSON nyata). Memiliki alias untuk TINYINT.
  • Kondisi apa pun mengembalikan bilangan bulat. Ini adalah tipe data tercepat untuk CPU, dan mungkin detail implementasi ini tercermin di sini. Misalnya, 'true' IS TRUEdan 1=1keduanya kembali 1sebagai int.
  • CAST tidak menyediakan TINYINTformat.

Sejauh yang saya tahu Anda tidak dapat menurunkan tipe, atau menghasilkan tinyint di a SELECT.

Saya akan sangat menyarankan bermigrasi ke PostgreSQL. Jauh lebih tidak menakutkan ... dan membebaskan.

Evan Carroll
sumber
2

Gunakan fungsi mysql CAST_TO_BIT

Contoh:

SELECT CAST_TO_BIT(1);

Mysql: SELECT CAST_TO_BIT (0) ; -> driver jdbc -> Java: Boolean false ;

Mysql: SELECT CAST_TO_BIT (1) ; -> driver jdbc -> Java: Boolean true ;

Mysql: SELECT CAST_TO_BIT (NULL) ; -> driver jdbc -> Java: NULL ;

Dharmendrasinh Chudasama
sumber