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

29

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

J'ai de nombreuses tables qui, par souci de simplicité, sont représentées 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.

Bruno
la source

Réponses:

26

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 peuvent accepter et renvoyer que les types suivants :

  • BINAIRE [(N)]
  • CHAR [(N)]
  • RENDEZ-VOUS AMOUREUX
  • 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 ...
RolandoMySQLDBA
la source
1
Un booléen est un alias pour tinyint. En aucun cas ne IFretourne un tinyintdonc je ne vois pas comment cette réponse est correcte ou acceptée.
Evan Carroll
@EvanCarroll Ma réponse est destinée à contourner complètement CAST et CONVERT..Utiliser la fonction IF fait ce que son framework ne fera pas, qui est de reconnaître BOOLEAN comme INT (4 octets) plutôt que TINYINT (1 octet). Dans ce cas, vous avez blâmé le framework de ne pas travailler avec les valeurs BOOLEAN.
RolandoMySQLDBA
10

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

... `YourField` IS NOT NULL AS `YourField` ...
Roman Newaza
la source
Honnêtement, c'est la façon la plus simple. Et fonctionne pour mon cas. Merci!
Mike Harrison
4

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 souhaitez contraindre NULL à FALSE, faites

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

poseidonCore
la source
1
Je me demande, comment cela permet-il de convertir un entier en booléen?
ypercubeᵀᴹ
2

Vous pouvez également utiliser "CASE":

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

Zvezdochka
la source
Vous devez le convertir en booléen, sinon c'est un champ char.
McNets
Parfois, le consommateur de votre requête veut un personnage
Eric Wilson
2

C'est actuellement impossible.

  • MySQL n'a pas de vrai BOOLEANtype, (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 vraisemblablement reflété ici. Par exemple, 'true' IS TRUEet les 1=1deux reviennent en 1tant que int.
  • CAST ne fournit pas de TINYINTformat.

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

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

Evan Carroll
la source
2

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: booléen true ;

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

Dharmendrasinh Chudasama
la source