it-swarm.asia

Bagaimana cara melemparkan integer ke boolean di klausa MySQL SELECT?

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 di aplikasi saya, tapi saya lebih suka ini diselesaikan dalam database, karena akan digunakan oleh perangkat lunak lain nanti.

29
Bruno

Coba gunakan IF function:

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 berikut :

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

Karena BOOLEAN tidak ada dalam daftar ini, itu tidak akan pernah bisa dikembalikan oleh CAST atau CONVERT

Anda bisa menggunakan fungsi IF untuk menghasilkan string

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

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

... `YourField` IS NOT NULL AS `YourField` ...
10
Roman Newaza

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);

5
poseidonCore

Saat ini tidak mungkin.

  • MySQL tidak memiliki tipe BOOLEAN nyata, (atau tipe array nyata .. atau tipe JSON nyata). Ini 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. Contohnya, 'true' IS TRUE dan 1=1 keduanya kembali 1 sebagai int.
  • CAST tidak menyediakan format TINYINT.

Sejauh yang saya tahu Anda tidak dapat mendemosikan suatu tipe, maupun menghasilkan tinyint dalam SELECT.

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

2
Evan Carroll

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 ;

Anda juga dapat menggunakan "CASE":

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

2
Zvezdochka

CAST(IF(col_name = 1, 'true', 'false') AS JSON) dapat berfungsi untuk beberapa kasus penggunaan.

Pada MySQL 5.7.8 ada dukungan untuk tipe data JSON asli yang didefinisikan oleh RFC 7159. Untuk kasus penggunaan saya, saya memiliki kolom INT yang selalu 0 atau 1, tetapi saya membutuhkan output sebagai bool true atau false bukan string "true" atau "false".

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

0
Aaron