web-dev-qa-db-de.com

MySQL-Äquivalent der DECODE-Funktion in Oracle

Ich versuche ein Äquivalent der DECODE-Funktion in MySQL zu finden. Es funktioniert so:

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

Die DECODE-Funktion vergleicht den Wert der Spalte 'Age' mit 13, 14, 15 .. und gibt den entsprechenden String-Wert 'Thirteen', 'Fourteen' ... zurück. Wenn er mit nichts übereinstimmt, wird der Standardwert 'Adult' zurückgegeben .

Welche Ideen, die in MySQL funktionieren, können diese Aufgabe erfüllen? Vielen Dank.

Erklärung: Ich bin damit einverstanden, dass CASE eine Möglichkeit ist, das gewünschte Ergebnis zu erzielen, aber ich suche eher nach einerfunctionwegen der Leistung und anderer Gründe.

28
Ali

Sie können IF() verwenden, wo Sie in Oracle DECODE() verwendet hätten. 

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

Sie können eine CASE -Anweisung verwenden ... aber warum erstellen Sie nicht einfach eine Tabelle mit einer Ganzzahl für Alter zwischen 0 und 150, einem Varchar für das ausgeschriebene Alter, und dann können Sie daran teilnehmen

14
SQLMenace

Eine andere MySQL-Option, die eher wie Oracle DECODE aussieht, ist eine Kombination aus FIELD und ELT. Im folgenden Code gibt FIELD() die Position der Argumentliste der Zeichenfolge zurück, die mit Age übereinstimmt. ELT() gibt den String aus der ELTs-Argumentliste an der von FIELD() angegebenen Position zurück. Wenn zum Beispiel Age14 ist, gibt FIELD(Age, ...)2 zurück, da 14 das 2. Argument von FIELD ist (Age nicht zählt). Dann gibt ELT(2, ...)'Fourteen' zurück. Dies ist das 2. Argument von ELT (das Argument FIELD() wird nicht gezählt). IFNULL gibt den Standardwert AgeBracket zurück, wenn keine Übereinstimmung mit Age in der Liste gefunden wird.

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

Auch wenn ich nicht der Meinung bin, dass dies die beste Lösung für die Frage ist, sowohl was die Leistung als auch die Lesbarkeit angeht, so ist dies doch eine Untersuchung der MySQL-Stringfunktionen. Beachten Sie, dass die Ausgabe von FIELD nicht die Groß- und Kleinschreibung zu berücksichtigen scheint. Das heißt, FIELD('A','A') und FIELD('a','A') geben beide 1 zurück.

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

Das Beispiel übersetzt direkt in:

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

die Sie möglicherweise formatieren möchten, z. so was:

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

sie können if () anstelle von decode () in mySql wie folgt verwenden Diese Abfrage druckt alle geraden ID-Zeilen.

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

Wenn eine zusätzliche Tabelle nicht passt, können Sie eine eigene Funktion für die Übersetzung schreiben.

Das Plus der SQL-Funktion ist, dass Sie sie an verschiedenen Stellen verwenden können und die Übersetzungslogik an einem Ort aufbewahren können.

0
Danubian Sailor