web-dev-qa-db-fra.com

Comment convertir un entier en booléen dans une clause MySQL SELECT?

Je suis nouveau ici, alors soyez gentil avec moi. J'ai le scénario suivant:

J'ai de nombreux tableaux qui, par souci de simplicité, sont représentés dans une vue dans ma base de données MySQL. Mon problème est que j'ai besoin d'une valeur dans cette vue représentant s'il s'agit d'un type d'événement ou d'un autre (un simple booléen), que j'ai essayé de réaliser avec:

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

Le résultat est représenté par int et est donc lu par Entity Framework. Le problème est que j'ai vraiment besoin d'une valeur de retour booléenne, que j'ai essayé d'obtenir avec:

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

Cela a entraîné une erreur, une erreur qui ne m'est pas affichée dans MySQL Workbench (je ne reçois que l'ennuyeux "Vous avez une erreur dans ...").

Pouvez-vous m'aider s'il vous plaît?

J'ai essayé de le résoudre dans mon application, mais je préfère vraiment que cela soit résolu dans la base de données, car il sera utilisé par d'autres logiciels plus tard.

29
Bruno

Essayez d'utiliser la fonction IF:

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

ou

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

Même sans la fonction IF, en cours d'exécution

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

mysql>

donner 0 ou 1 en utilisant le client mysql

Le problème est le suivant: CAST () = et CONVERT () ne peut accepter et renvoyer que les types suivants :

  • BINAIRE [(N)]
  • CHAR [(N)]
  • DATE
  • DATETIME
  • DÉCIMAL [(M [ D])]
  • SIGNÉ [ENTIER]
  • TEMPS
  • UNSIGNED [INTEGER]

Puisque BOOLEAN ne figure pas dans cette liste, il ne peut jamais être retourné par CAST ou CONVERT

Vous pouvez utiliser la fonction IF pour générer des chaînes

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

Vous pouvez le faire de manière très simple, sans utiliser l'instruction IF () redondante:

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

Vous pouvez également essayer la coercition booléenne classique:

SÉLECTIONNEZ PAS NON (peu importe);

La bonne chose à ce sujet est qu'il préserve naturellement les valeurs NULL, contrairement à la plupart des réponses ici.

Si vous voulez contraindre NULL à FALSE, faites

SELECT IFNULL (NOT NOT (any), FALSE);

5
poseidonCore

C'est actuellement impossible.

  • MySQL n'a pas un vrai type BOOLEAN, (ou un vrai type de tableau .. ou un vrai type JSON). Il a un alias pour TINYINT.
  • Toute condition renvoie un entier. Il s'agit du type de données le plus rapide pour un processeur, et ce détail d'implémentation est probablement reflété ici. Par exemple, 'true' IS TRUE et 1=1 les deux retournent 1 en tant que int.
  • CAST ne fournit pas de format TINYINT.

Autant que je sache, vous ne pouvez ni rétrograder un type, ni produire une minuscule dans un SELECT.

Je voudrais fortement suggérer de migrer vers PostgreSQL. C'est tellement moins terrifiant ... et libérateur.

2
Evan Carroll

Utilisez la fonction mysql CAST_TO_BIT

Exemples:

SELECT CAST_TO_BIT(1);

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

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

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

Vous pouvez également utiliser "CASE":

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

2
Zvezdochka

CAST(IF(col_name = 1, 'true', 'false') AS JSON) peut fonctionner dans certains cas d'utilisation.

Depuis MySQL 5.7.8, il existe un support pour un type de données JSON natif défini par RFC 7159. Pour mon cas d'utilisation, j'avais une colonne INT qui était toujours soit 0 soit 1, mais j'avais besoin de la sortie en tant que bool true ou false pas une chaîne "true" ou "false".

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

0
Aaron