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.
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;
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
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 ELT
s-Argumentliste an der von FIELD()
angegebenen Position zurück. Wenn zum Beispiel Age
14
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.
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
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
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);
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.