web-dev-qa-db-fra.com

Equivalent MySQL de la fonction DECODE dans Oracle

J'essaie de trouver un équivalent de la fonction DECODE dans MySQL. Cela fonctionne comme ceci:

Select Name, DECODE(Age,
       13,'Thirteen',14,'Fourteen',15,'Fifteen',16,'Sixteen',
       17,'Seventeen',18,'Eighteen',19,'Nineteen',
       'Adult') AS AgeBracket
FROM Person

La fonction DECODE compare la valeur de la colonne 'Age' avec 13, 14, 15 .. et renvoie la valeur de chaîne appropriée 'Treize', 'Quatorze' .. et si elle correspond à rien, la valeur par défaut de 'Adult' sera renvoyée .

Des idées qui fonctionnent dans MySQL peuvent faire ce travail? Merci.

CLARIFICATION: Je suis d’accord pour dire que l’utilisation de CASE est un moyen d’obtenir le résultat souhaité, mais je recherche plutôt unefonctionpour des raisons de performance, entre autres.

28
Ali

Vous pouvez utiliser IF() où vous auriez utilisé DECODE() dans Oracle. 

mysql> select if(emp_id=1,'X','Y') as test, emp_id from emps; 
41
Lokesh Kumar

Vous pouvez utiliser une instruction CASE ... mais pourquoi ne créez-vous pas une table avec un entier pour les âges compris entre 0 et 150 ans, un varchar pour l’âge écrit, puis vous pourrez simplement vous joindre

14
SQLMenace

Une autre option MySQL qui peut ressembler davantage à DECODE d’Oracle est une combinaison de FIELD et ELT. Dans le code qui suit, FIELD() renvoie la position de la liste des arguments de la chaîne correspondant à Age. ELT() renvoie la chaîne de la liste d'arguments ELTs à la position fournie par FIELD(). Par exemple, si Age est 14, FIELD(Age, ...) renvoie 2 car 14 est le deuxième argument de FIELD (sans compter Age). Ensuite, ELT(2, ...) renvoie 'Fourteen', qui est le deuxième argument de ELT (sans compter l'argument FIELD()). IFNULL renvoie la valeur par défaut AgeBracket si aucune correspondance avec Age ne figure dans la liste.

Select Name, IFNULL(ELT(FIELD(Age,
       13, 14, 15, 16, 17, 18, 19),'Thirteen','Fourteen','Fifteen','Sixteen',
       'Seventeen','Eighteen','Nineteen'),
       'Adult') AS AgeBracket
FROM Person

Bien que je ne pense pas que ce soit la meilleure solution à la question en termes de performances ou de lisibilité, il est intéressant d’explorer les fonctions string de MySQL. N'oubliez pas que la sortie de FIELD ne semble pas être sensible à la casse. Par exemple, FIELD('A','A') et FIELD('a','A') renvoient tous deux 1.

9
Seth Difley
Select Name, 
case 
  when Age = 13 then 'Thirteen'
  when Age = 14 then 'Fourteen'
  when Age = 15 then 'Fifteen'
  when Age = 16 then 'Sixteen'
  when Age = 17 then 'Seventeen'
  when Age = 18 then 'Eighteen'
  when Age = 19 then 'Nineteen'
  else 'Adult'
end as AgeBracket
FROM Person
8
Allen Kenney

L'exemple traduit directement en:

Select Name, CASE Age
       WHEN 13 then 'Thirteen' WHEN 14 then 'Fourteen' WHEN 15 then 'Fifteen' WHEN 16 then 'Sixteen'
       WHEN 17 then 'Seventeen' WHEN 18 then 'Eighteen' WHEN 19 then 'Nineteen'
       ELSE 'Adult' END AS AgeBracket
FROM Person

que vous préférez peut-être formater, par exemple. comme ça:

Select Name,
       CASE Age
         when 13 then 'Thirteen'
         when 14 then 'Fourteen'
         when 15 then 'Fifteen'
         when 16 then 'Sixteen'
         when 17 then 'Seventeen'
         when 18 then 'Eighteen'
         when 19 then 'Nineteen'
         else         'Adult'
       END AS AgeBracket
FROM Person
3
user6239614

vous pouvez utiliser if () à la place de decode () dans mySql comme suit Cette requête imprimera toutes les lignes, même id.

mysql> select id, name from employee where id in
-> (select if(id%2=0,id,null) from employee);
0
Niteesh Kumar

Si un tableau supplémentaire ne convient pas, vous pouvez écrire votre propre fonction pour la traduction.

L'avantage de la fonction SQL par rapport à la casse est que vous pouvez l'utiliser à différents endroits et conserver la logique de traduction au même endroit.

0
Danubian Sailor