So implementieren Sie einen ternären bedingten Operator in MySQL

88

Ich möchte einen ternären bedingten Operator in MySQL implementieren. Ich habe eine Tabelle, in der eine Feld-ID vorhanden ist. Sein Wert kann null sein. Ich möchte idin einem ternären bedingten Format wie folgt anzeigen :

select id = id == null ? 0 : id;

Ist es in MySQL möglich?

user1086355
quelle
mögliches Duplikat von Wie schreibt man eine Bedingung in eine MySQL-select-Anweisung?
Leichtigkeitsrennen im Orbit

Antworten:

146

Versuche dies :

select if(Id is null, 0, id) as Id;
Dewasish Mitruka
quelle
1
Es ist eine Schande, dass es keine Abkürzung gibt. Wenn Sie nur den ersten Wert erhalten möchten, der true entspricht, müssen Sie nach nulloder ''und vielleicht sogar suchen 0. mySQL ist manchmal ein bisschen wie eine Duche
Cronoklee
50

Die Dokumentation ist dein Freund; du solltest es lesen!

Es sagt:

IFNULL(expr1,expr2)

Wenn expr1nicht NULL, wird IFNULL()zurückgegeben expr1. Andernfalls wird es zurückgegeben expr2.

Und dann viele Beispiele. Dies entspricht der Verwendung einer ternären Bedingung mit einem Vergleich mit NULLund dem Vergleichssubjekt als zweitem Operanden. Dass es nicht passiert, die Symbole zu verwenden ?und :Sie dorthin zu bringen, ist für nichts wirklich relevant.

Also in Ihrem Fall:

SELECT IFNULL(`id`, 0) FROM `table`

Wenn Sie unbedingt drei Operanden explizit angeben möchten (warum?!), Wechseln Sie zu IF:

SELECT IF(`id` IS NULL, 0, `id`) FROM `table`
Leichtigkeitsrennen im Orbit
quelle
4
+1, aber um die Frage zu beantworten:CASE WHEN id IS NULL THEN 0 ELSE id END
Michael Krelin - Hacker
@ MichaelKrelin-Hacker: Das Gleiche, nein? Und IFNULList terser.
Leichtigkeitsrennen im Orbit
@ MichaelKrelin-Hacker: Oh, ich verstehe.
Leichtigkeitsrennen im Orbit
Klar, nur um die Frage zu ternary zu beantworten :)
Michael Krelin - Hacker
In meinem Fall muss ich IFanstelle von IFNULLoder verwenden, COALESCEweil ich Daten in eine andere Herstellerdatenbank migriere und die Nicht-Null-Werte nicht importieren möchte, sondern nur als generischen Status interpretieren möchte. SELECT IF(a.cancellationReason IS NOT NULL, 'C', 'A')) as appointment_statusfunktioniert bei mir.
Adam Elsodaney
21

Es gibt zwei Möglichkeiten, wie Sie dieselbe Logik wie ein ternärer Operator implementieren können:

  1. Verwenden Sie die IFFunktion, z.IF(expression, true result, false result)
  2. Verwenden Sie den CASEAusdruck, z.

    CASE WHEN expression THEN <true result> ELSE <false_result> END

Wenn Sie nach NULL suchen, können Sie die Funktionen IFNULLoder COALESCEverwenden, z.

IFNULL(ID, 0)
COALESCE(ID, 0)
a'r
quelle