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.
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 :
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 ...
Vous pouvez le faire de manière très simple, sans utiliser l'instruction IF () redondante:
... `YourField` IS NOT NULL AS `YourField` ...
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);
C'est actuellement impossible.
BOOLEAN
, (ou un vrai type de tableau .. ou un vrai type JSON). Il a un alias pour TINYINT
.'true' IS TRUE
et 1=1
les deux retournent 1
en tant que int
.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.
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
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