it-swarm.it

Come trasmettere un numero intero a un valore booleano in una clausola SELECT di MySQL?

Sono nuovo qui, quindi sii gentile con me. Ho il seguente scenario:

Ho molte tabelle che, per semplicità, sono rappresentate in una vista nel mio database MySQL. Il mio problema è che ho bisogno di un valore in questa vista che rappresenti se è un tipo di evento o un altro (un semplice booleano), che ho cercato di ottenere con:

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

Il risultato è rappresentato come int e quindi viene letto da Entity Framework. Il problema è che ho davvero bisogno di un valore di ritorno booleano, che ho cercato di ottenere con:

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

Ciò ha provocato un errore, che non mi viene visualizzato in MySQL Workbench (ricevo solo quel fastidioso "Hai un errore in ...").

Ragazzi, per favore, potete aiutarmi?

Ho cercato di risolverlo nella mia applicazione, ma ho davvero preferito risolverlo nel database, poiché verrà utilizzato da altri software in seguito.

29
Bruno

Prova a usare Funzione IF:

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

o

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

Anche senza la funzione IF, in esecuzione

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

mysql>

rendi 0 o 1 usando il client mysql

Il problema è questo: CAST () = e CONVERT () può accettare e restituire solo i seguenti tipi :

  • BINARIO [(N)]
  • CHAR [(N)]
  • DATA
  • APPUNTAMENTO
  • DECIMAL [(M [D])]
  • FIRMATO [INTEGER]
  • TEMPO
  • UNSIGNED [INTEGER]

Poiché BOOLEAN non è in questo elenco, non può mai essere restituito da CAST o CONVERT

È possibile utilizzare la funzione IF per generare stringhe

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

Puoi farlo in modo molto semplice, senza usare l'istruzione IF () ridondante:

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

Puoi anche provare la classica coercizione booleana:

SELEZIONA NON NOT (qualunque cosa);

La cosa positiva di questo è che preserva naturalmente i NULL, mentre la maggior parte delle risposte qui non lo fanno.

Se vuoi forzare NULL su FALSE, allora fallo

SELEZIONA IFNULL (NON NOT (qualunque), FALSE);

5
poseidonCore

Questo è attualmente impossibile.

  • MySQL non ha un vero tipo BOOLEAN (o un tipo di array reale .. o un tipo JSON reale). Ha un alias per TINYINT.
  • Qualsiasi condizione restituisce un numero intero. Questo è il tipo di dati più veloce per una CPU e presumibilmente questo dettaglio di implementazione si riflette qui. Per esempio, 'true' IS TRUE e 1=1 entrambi restituiscono 1 come int.
  • CAST non fornisce un formato TINYINT.

Per quanto ne so, non puoi né degradare un tipo, né produrre un minuscolo in un SELECT.

Vorrei altamente suggerirei di migrare su PostgreSQL. È molto meno terrificante ... e liberatorio.

2
Evan Carroll

Usa la funzione mysql CAST_TO_BIT

Esempi:

SELECT CAST_TO_BIT(1);

Mysql: SELEZIONA CAST_TO_BIT (0); -> driver jdbc -> Java: Booleano false;

Mysql: SELEZIONA CAST_TO_BIT (1); -> driver jdbc -> Java: Booleano vero;

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

Puoi anche usare "CASE":

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

2
Zvezdochka

CAST(IF(col_name = 1, 'true', 'false') AS JSON) potrebbe funzionare in alcuni casi d'uso.

A partire da MySQL 5.7.8 esiste il supporto per un tipo di dati JSON nativo definito da RFC 7159. Nel mio caso d'uso avevo una colonna INT che era sempre 0 o 1, ma avevo bisogno dell'output come bool true o false non stringa "true" o "false".

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

0
Aaron