50 Stimmen

MySQL-Entsprechung der DECODE-Funktion in Oracle

Ich versuche, eine Entsprechung der DECODE-Funktion in MySQL zu finden. Es funktioniert wie folgt:

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 'Alter' mit 13, 14, 15 und gibt den entsprechenden Stringwert 'Dreizehn', 'Vierzehn' zurück. Wenn nichts übereinstimmt, wird der Standardwert 'Erwachsener' zurückgegeben.

Gibt es eine Idee, welche Funktion in MySQL diese Aufgabe übernehmen kann? Danke!

KLÄRUNG: Ich stimme zu, dass die Verwendung von CASE eine Möglichkeit ist, das gewünschte Ergebnis zu erzielen, aber ich bin eher auf der Suche nach einer Funktion aus Leistungsgründen und aus anderen Gründen.

5 Stimmen

Eine Funktion wird nicht schneller sein als die CASE-Anweisung

0 Stimmen

Das ELT von Mysql scheint ein DECODE-Alternativprogramm zu sein: dev.mysql.com/doc/refman/4.1/de/

61voto

Lokesh Kumar Punkte 551

Sie können verwenden IF() wo Sie in Oracle die Funktion DECODE() .

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

26voto

Allen Kenney Punkte 441
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

19voto

SQLMenace Punkte 128184

Sie können eine CASE Anweisung... aber warum erstellen Sie nicht einfach eine Tabelle mit einem Integer für das Alter zwischen 0 und 150, einem Varchar für das ausgeschriebene Alter und dann können Sie einfach eine Verknüpfung mit dieser

10voto

Seth Difley Punkte 1300

Eine weitere MySQL-Option, die eher der von Oracle ähnelt DECODE ist eine Kombination aus FIELD y ELT . In dem folgenden Code, FIELD() gibt die Position der Zeichenkette in der Argumentliste zurück, die mit Age übereinstimmt. ELT() gibt die Zeichenkette aus ELT an der Position, die in der Argumentliste von FIELD() . Zum Beispiel, wenn Age es 14 , FIELD(Age, ...) gibt zurück. 2 porque 14 ist das 2. Argument von FIELD (nicht mitgezählt Age ). Dann, ELT(2, ...) gibt zurück. 'Fourteen' das ist das 2. Argument von ELT (nicht mitgezählt die FIELD() Argument). IFNULL gibt den Standardwert AgeBracket wenn keine Übereinstimmung mit Age in der Liste zu finden ist.

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

Ich glaube zwar nicht, dass dies die beste Lösung für die Frage ist, weder in Bezug auf die Leistung noch auf die Lesbarkeit, aber es ist interessant, die String-Funktionen von MySQL zu untersuchen. Denken Sie daran, dass FIELD scheint die Groß- und Kleinschreibung nicht zu beachten. D.h., FIELD('A','A') y FIELD('a','A') beide kehren zurück 1 .

5voto

user6239614 Punkte 51

Das Beispiel lässt sich direkt übersetzen 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 z. B. wie folgt formatieren können:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X