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


29

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 si tratta di un tipo di evento o di un altro (un semplice booleano), che ho cercato di ottenere con:

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

Il risultato è rappresentato come int e così 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.

Risposte:


26

Prova a utilizzare la 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 () possono solo accettare e restituire 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 ...

1
Un booleano è un alias per tinyint. In nessun caso IFrestituisce a, tinyintquindi non riesco a vedere come questa risposta sia giusta o accettata.
Evan Carroll,

@EvanCarroll La mia risposta ha lo scopo di eludere del tutto CAST e CONVERT .. L'uso della funzione IF fa ciò che il suo framework non farà, il che significa BOOLEAN come INT (4 byte) anziché TINYINT (1 byte). In questo caso, hai incolpato il framework per non lavorare con i valori BOOLEAN.
RolandoMySQLDBA,

10

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

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

Onestamente questo è il modo più semplice. E funziona per il mio caso. Grazie!
Mike Harrison,

4

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


1
Mi chiedo, come si ottiene la conversione di un numero intero in booleano?
ypercubeᵀᴹ

2

Puoi anche usare "CASE":

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


Dovresti lanciarlo come booleano, se non è un campo char.
McNets,

A volte il consumatore della query vuole un personaggio, anche se
Eric Wilson

2

Questo è attualmente impossibile.

  • MySQL non ha un BOOLEANtipo reale (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. Ad esempio, 'true' IS TRUEed 1=1entrambi ritornano 1come int.
  • CAST non fornisce un TINYINTformato.

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

Consiglio vivamente di migrare su PostgreSQL. È molto meno terrificante ... e liberatorio.


2

Usa la funzione mysql CAST_TO_BIT

Esempi:

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 ;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.