Comment implémenter un opérateur conditionnel ternaire dans MySQL

89

Je veux implémenter un opérateur conditionnel ternaire dans MySQL. J'ai une table dans laquelle un identifiant de champ existe. Sa valeur peut être nulle. Je veux afficher iddans un format conditionnel ternaire comme ceci:

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

Est-ce possible dans MySQL?

user1086355
la source
duplication possible de Comment écrivez-vous un conditionnel dans une instruction de sélection MySQL?
Courses de légèreté en orbite

Réponses:

149

Essaye ça :

select if(Id is null, 0, id) as Id;
Dewasish Mitruka
la source
1
C'est dommage qu'il n'y ait pas de raccourci. Si vous voulez juste obtenir la première valeur qui équivaut à vrai, vous devez vérifier nullou ''et peut-être même 0. mySQL est parfois un peu duché
cronoklee
53

La documentation est votre ami; vous devriez le lire!

Ça dit:

IFNULL(expr1,expr2)

Si ce expr1n'est pas le cas NULL, IFNULL()retourne expr1; sinon, il revient expr2.

Et puis plein d'exemples. Cela équivaut à utiliser un conditionnel ternaire avec une comparaison à NULLet le sujet de comparaison comme deuxième opérande; qu'il n'arrive pas à utiliser les symboles ?et :à vous y amener n'est vraiment pertinent pour rien.

Donc, dans votre cas:

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

Si vous êtes désespéré de fournir trois opérandes explicitement (pourquoi?!), Passez à IF:

SELECT IF(`id` IS NULL, 0, `id`) FROM `table`
Courses de légèreté en orbite
la source
4
+1, mais pour répondre à la question:CASE WHEN id IS NULL THEN 0 ELSE id END
Michael Krelin - hacker
@ MichaelKrelin-hacker: Même chose, non? Et IFNULLc'est terser.
Courses de légèreté en orbite
@ MichaelKrelin-hacker: Oh, je comprends.
Courses de légèreté en orbite
Bien sûr, juste pour répondre à la question sur ternaire :)
Michael Krelin - hacker
Dans mon cas, je dois utiliser à la IFplace IFNULLou COALESCEparce que je migre des données vers une base de données de fournisseur différente et que je ne veux pas importer les valeurs non nulles, l'interpréter uniquement comme un statut générique. SELECT IF(a.cancellationReason IS NOT NULL, 'C', 'A')) as appointment_statustravaille pour moi.
Adam Elsodaney
22

Il existe deux façons d'implémenter la même logique qu'un opérateur ternaire:

  1. Utilisez la IFfonction, par exemple.IF(expression, true result, false result)
  2. Utilisez l' CASEexpression, par exemple.

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

Lorsque vous recherchez NULL, vous pouvez utiliser les fonctions IFNULLou COALESCE, par exemple.

IFNULL(ID, 0)
COALESCE(ID, 0)
a'r
la source