it-swarm.com.de

Wie wandle ich eine Ganzzahl in einen Booleschen Wert in einer MySQL SELECT-Klausel um?

Ich bin neu hier, also sei nett zu mir. Ich habe das folgende Szenario:

Ich habe viele Tabellen, die der Einfachheit halber in einer Ansicht in meiner MySQL-Datenbank dargestellt werden. Mein Problem ist, dass ich in dieser Ansicht einen Wert benötige, der angibt, ob es sich um die eine oder andere Art von Ereignis handelt (ein einfacher Boolescher Wert), mit dem ich Folgendes erreichen wollte:

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

Das Ergebnis wird als int dargestellt und daher vom Entity Framework gelesen. Das Problem ist, dass ich wirklich einen booleschen Rückgabewert brauche, den ich erreichen wollte mit:

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

Dies führte zu einem Fehler, der mir in MySQL Workbench nicht angezeigt wird (ich erhalte nur das nervige "Sie haben einen Fehler in ...").

Könnt ihr mir bitte helfen?

Ich habe versucht, es in meiner Anwendung zu lösen, aber ich bevorzuge es wirklich, wenn es in der Datenbank gelöst wird, da es später von anderer Software verwendet wird.

29
Bruno

Versuchen Sie es mit der IF-Funktion :

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

oder

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

Auch ohne die IF-Funktion läuft

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

mysql>

geben Sie 0 oder 1 mit dem MySQL-Client

Das Problem ist folgendes: CAST () = und CONVERT () kann nur die folgenden Typen akzeptieren und zurückgeben :

  • BINARY [(N)]
  • CHAR [(N)]
  • DATUM
  • TERMINZEIT
  • DEZIMAL [(M [ D])]
  • UNTERZEICHNET [INTEGER]
  • ZEIT
  • UNSIGNED [INTEGER]

Da BOOLEAN nicht in dieser Liste enthalten ist, kann es niemals von CAST oder CONVERT zurückgegeben werden

Sie können die IF-Funktion verwenden, um Zeichenfolgen zu generieren

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

Sie können dies auf sehr einfache Weise tun, ohne die redundante IF () - Anweisung zu verwenden:

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

Sie können auch den klassischen booleschen Zwang ausprobieren:

SELECT NOT NOT (was auch immer);

Das Gute daran ist, dass es natürlich NULL-Werte bewahrt, während die meisten Antworten hier dies nicht tun.

Wenn Sie NULL zu FALSE zwingen möchten, tun Sie dies

SELECT IFNULL (NICHT NICHT (was auch immer), FALSE);

5
poseidonCore

Dies ist derzeit nicht möglich.

  • MySQL hat keinen echten BOOLEAN -Typ (oder einen echten Array-Typ .. oder einen echten JSON-Typ). Es hat einen Alias ​​für TINYINT.
  • Jede Bedingung gibt eine Ganzzahl zurück. Dies ist der schnellste Datentyp für eine CPU, und vermutlich spiegelt sich dieses Implementierungsdetail hier wider. Zum Beispiel geben 'true' IS TRUE Und 1=1 Beide 1 Als int zurück.
  • CAST bietet kein TINYINT Format.

Soweit ich das beurteilen kann, können Sie weder einen Typ herabstufen noch einen winzigen Wert in einem SELECT erzeugen.

Ich würde sehr vorschlagen, auf PostgreSQL zu migrieren. Es ist so viel weniger erschreckend ... und befreiend.

2
Evan Carroll

Verwenden Sie die MySQL-Funktion CAST_TO_BIT

Beispiele:

SELECT CAST_TO_BIT(1);

MySQL: SELECT CAST_TO_BIT (0); -> jdbc driver -> Java: Boolean false;

MySQL: SELECT CAST_TO_BIT (1); -> jdbc driver -> Java: Boolean true;

MySQL: SELECT CAST_TO_BIT (NULL); -> jdbc driver -> Java: NULL ;

Sie können auch "CASE" verwenden:

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

2
Zvezdochka

CAST(IF(col_name = 1, 'true', 'false') AS JSON) funktioniert möglicherweise in einigen Anwendungsfällen.

Ab MySQL 5.7.8 wird ein von RFC 7159 definierter nativer JSON-Datentyp unterstützt. Für meinen Anwendungsfall hatte ich eine INT -Spalte, die immer entweder 0 oder 1 war, aber ich brauchte die Ausgabe als bool true oder false nicht Zeichenfolge "true" oder "false".

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

0
Aaron