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.
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;
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
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 ELT
s à 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
.
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
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
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);
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.