2011-01-16 17 views
24

Próbuję znaleźć odpowiednik funkcji DECODE w MySQL. To działa tak:MySQL odpowiednik funkcji DECODE w Oracle

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

Funkcja dekodowania porówna wartość kolumny „wiek” z 13, 14, 15 .. i powrócić odpowiednią wartość ciągu „Trzynaście”, „czternaście” .. i jeśli pasuje z nic, zostanie zwrócona domyślna wartość "Dorosły".

Wszelkie pomysły funkcjonujące w MySQL mogą wykonywać tę pracę? Dzięki.

Wyjaśnienie: Zgadzam się z wykorzystaniem przypadek jest jednym ze sposobów osiągnięcia pożądanego rezultatu, ale jestem raczej szuka funkcji z powodu wydajności i innych powodów.

+5

Funkcja nie będzie szybsza niż instrukcja CASE –

Odpowiedz

13

Można użyć CASE oświadczenie ... jednak dlaczego nie można po prostu stworzyć tabelę z liczbą całkowitą od wieków między 0 a 150, varchar do pisemnego z wiekiem, a następnie można przystąpić tylko na tym

+3

+1 dla nowej tabeli i JOIN. taki mały stolik zmieściłby się w pamięci RAM, a wydajność powinna być równie dobra jak wbudowana funkcja. – Javier

+0

łącze jest zerwane –

0

Jeśli dodatkowa tabela nie pasuje, możesz napisać własną funkcję tłumaczenia.

Dodatkowym atutem funkcji sql w stosunku do przypadku jest to, że można go używać w różnych miejscach i zachować logikę tłumaczenia w jednym miejscu.

33

Możesz użyć IF() gdzie w Oracle użyłbyś DECODE().

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

Spróbuj tego:

Select Name, ELT(Age-12,'Thirteen','Fourteen','Fifteen','Sixteen', 
    'Seventeen','Eighteen','Nineteen','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult', 
    'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult') AS AgeBracket FROM Person 
5
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 
7

Inną opcją MySQL, że może wyglądać bardziej jak Oracle DECODE jest połączenie FIELD i ELT. W poniższym kodzie FIELD() zwraca pozycję listy argumentów ciągu pasującego do Age. ELT() zwraca ciąg znaków z listy argumentów ELT s w pozycji podanej przez FIELD(). Na przykład, jeśli Age jest 14, FIELD(Age, ...) zwraca 2, ponieważ 14 jest drugim argumentem z FIELD (nie licząc Age). Następnie ELT(2, ...) zwraca 'Fourteen', który jest drugim argumentem z ELT (nie licząc argumentu FIELD()). IFNULL zwraca wartość domyślną AgeBracket, jeśli na liście nie znaleziono dopasowania do Age.

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 

Chociaż nie sądzę, jest to najlepsze rozwiązanie na pytanie albo w kategoriach charakterystyki lub czytelności jest interesujący jako badanie funkcji łańcuchowych MySQL. Należy pamiętać, że dane wyjściowe FIELD nie są wrażliwe na wielkość liter. Tj. FIELD('A','A') i FIELD('a','A') zarówno zwracają 1.

1

Przykład przekłada się bezpośrednio do:

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 

który może wolisz, aby sformatować np tak:

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 
0

można użyć, jeśli() zamiast dekodowania() w MySQL następująco To zapytanie będzie drukować wszystkie nawet wiersz id.

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