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


29

Ich bin neu hier, also sei nett zu mir. Ich habe folgendes 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 brauche, der angibt, ob es sich um eine oder eine andere Art von Ereignis handelt (ein einfacher Boolescher Wert), den ich versucht habe, zu erreichen mit:

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

Das Ergebnis wird als int dargestellt und von Entity Framework gelesen. Das Problem ist, dass ich wirklich einen booleschen Rückgabewert brauche, den ich versucht habe 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?

Es wurde 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 einer anderen Software verwendet wird.

Antworten:


26

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>

ergeben 0 oder 1 mit dem MySQL-Client

Das Problem ist folgendes: CAST () und CONVERT () können 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 ...

1
Ein Boolescher Wert ist ein Alias ​​für tinyint. Keinesfalls IFkehrt ein zurück, tinyintsodass ich nicht sehen kann, wie diese Antwort richtig ist oder akzeptiert wird.
Evan Carroll

@EvanCarroll Meine Antwort soll CAST und CONVERT insgesamt umgehen. Mit der IF-Funktion wird das getan, was sein Framework nicht tut. Dabei wird BOOLEAN als INT (4-Byte) und nicht als TINYINT (1-Byte) erkannt. In diesem Fall haben Sie das Framework dafür verantwortlich gemacht, dass es nicht mit BOOLEAN-Werten arbeitet.
RolandoMySQLDBA

10

Sie können dies ganz einfach tun, ohne die redundante IF () -Anweisung zu verwenden:

... `YourField` IS NOT NULL AS `YourField` ...

Ehrlich gesagt ist dies der einfachste Weg. Und arbeitet für meinen Fall. Vielen Dank!
Mike Harrison

4

Sie können auch den klassischen booleschen Zwang ausprobieren:

SELECT NOT NOT (was auch immer);

Das Gute daran ist, dass es auf natürliche Weise NULL-Werte beibehält, während die meisten Antworten dies nicht tun.

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

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


1
Ich frage mich, wie dies eine Umwandlung einer Ganzzahl in einen Booleschen Wert erreichen kann.
ypercubeᵀᴹ

2

Sie können auch "CASE" verwenden:

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


Sie sollten es als booleschen Wert umwandeln, wenn es sich nicht um ein Zeichenfeld handelt.
McNets

Manchmal möchte der Konsument Ihrer Anfrage jedoch einen Charakter
Eric Wilson

2

Dies ist derzeit nicht möglich.

  • MySQL hat keinen echten BOOLEANTyp (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. Vermutlich spiegelt sich dieses Implementierungsdetail hier wider. Zum Beispiel 'true' IS TRUEund 1=1beide kehren 1als zurück int.
  • CAST stellt kein TINYINTFormat zur Verfügung.

Soweit ich Ihnen sagen kann, können Sie weder einen Typ herabstufen, noch eine winzige Zahl in einem erzeugen SELECT.

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


2

Verwenden Sie die MySQL-Funktion CAST_TO_BIT

Beispiele:

SELECT CAST_TO_BIT(1);

MySQL: SELECT CAST_TO_BIT (0) ; -> JDBC-Treiber -> Java: Boolean false ;

MySQL: SELECT CAST_TO_BIT (1) ; -> JDBC-Treiber -> Java: Boolean true ;

MySQL: SELECT CAST_TO_BIT (NULL) ; -> JDBC-Treiber -> Java: NULL ;

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.