¿Cómo convertir un entero a un booleano en una cláusula SELECT de MySQL?

29

Soy nuevo aquí, así que sé amable conmigo. Tengo el siguiente escenario:

Tengo muchas tablas que, por simplicidad, están representadas en una Vista en mi base de datos MySQL. Mi problema es que necesito un valor en esta vista que represente si es un tipo de evento u otro (un booleano simple), que intenté lograr con:

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

El resultado se representa como int, y Entity Framework lo lee. El problema es que realmente necesito un valor de retorno booleano, que intenté lograr con:

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

Esto resultó en un error, uno que no me aparece en MySQL Workbench (solo recibo ese molesto "Tienes un error en ...").

¿Pueden ustedes ayudarme por favor?

Intenté resolverlo en mi aplicación, pero realmente prefiero que esto se resuelva en la base de datos, ya que será utilizado por otro software más adelante.

Bruno
fuente

Respuestas:

26

Intente usar la función IF:

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

o

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

Incluso sin la función IF, ejecutando

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

mysql>

producir 0 o 1 usando el cliente mysql

El problema es este: CAST () y CONVERT () solo pueden aceptar y devolver los siguientes tipos :

  • BINARIO [(N)]
  • CHAR [(N)]
  • FECHA
  • FECHA Y HORA
  • DECIMAL [(M [, D])]
  • FIRMADO [INTEGER]
  • HORA
  • SIN FIRMAR [INTEGER]

Dado que BOOLEAN no está en esta lista, CAST o CONVERT nunca pueden devolverlo.

Puede usar la función IF para generar cadenas

SELECT IF(`gu`.`StoppingUnitEventME`=`ese`.`MonitoringElement`, 'TRUE', 'FALSE') 
FROM ...
RolandoMySQLDBA
fuente
1
Un booleano es un alias para tinyint. Bajo ninguna circunstancia IFdevuelve un, tinyintasí que no puedo ver cómo esta respuesta es correcta o aceptada.
Evan Carroll
@EvanCarroll Mi respuesta está destinada a omitir CAST y CONVERT por completo ... El uso de la función IF hace lo que su marco no hará, que es reconocer BOOLEAN como INT (4 bytes) en lugar de TINYINT (1 byte). En este caso, tiene la culpa del marco por no trabajar con valores BOOLEAN.
RolandoMySQLDBA
10

Puede hacerlo de manera muy simple, sin el uso de la declaración redundante IF ():

... `YourField` IS NOT NULL AS `YourField` ...
Roman Newaza
fuente
Honestamente, esta es la forma más fácil. Y funciona para mi caso. ¡Gracias!
Mike Harrison
4

También puedes probar la clásica coerción booleana:

SELECCIONE NO NO (lo que sea);

Lo bueno de esto es que, naturalmente, conserva NULL, mientras que la mayoría de las respuestas aquí no.

Si quieres obligar a NULL a FALSE, entonces haz

SELECCIONE IFNULL (NO NO (lo que sea), FALSO);

poseidonCore
fuente
1
Me pregunto, ¿cómo logra esto convertir un entero a booleano?
ypercubeᵀᴹ
2

También puede usar "CASO":

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

Zvezdochka
fuente
Debería lanzarlo como booleano, si no es un campo char.
McNets
Sin embargo, a veces el consumidor de su consulta quiere un personaje
Eric Wilson
2

Esto es actualmente imposible.

  • MySQL no tiene un BOOLEANtipo real (o un tipo de matriz real ... o un tipo JSON real). Tiene un alias para TINYINT.
  • Cualquier condición devuelve un entero. Este es el tipo de datos más rápido para una CPU, y presumiblemente este detalle de implementación se refleja aquí. Por ejemplo, 'true' IS TRUEy 1=1ambos regresan 1como un int.
  • CAST no proporciona un TINYINTformato.

Por lo que puedo decir, no puedes degradar un tipo, ni producir una minúscula en un SELECT.

Me altamente sugerir migrar a PostgreSQL. Es mucho menos aterrador ... y liberador.

Evan Carroll
fuente
2

Use la función mysql CAST_TO_BIT

Ejemplos:

SELECT CAST_TO_BIT(1);

Mysql: SELECCIONE CAST_TO_BIT (0) ; -> controlador jdbc -> Java: booleano falso ;

Mysql: SELECCIONE CAST_TO_BIT (1) ; -> controlador jdbc -> Java: booleano verdadero ;

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

Dharmendrasinh Chudasama
fuente