2011-01-16 19 views
24

Sto cercando di trovare un equivalente della funzione DECODE in MySQL. Funziona in questo modo:Equivalente MySQL della funzione DECODE in Oracle

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

La funzione DECODE confronterà valore della colonna 'Age' con 13, 14, 15 .. e rendimento adeguato valore stringa 'Thirteen', 'Quattordici' .. e se corrisponde con nulla, verrà restituito il valore predefinito di "Adulto".

Qualsiasi idea che funzioni in MySQL può svolgere questo lavoro? Grazie.

PRECISAZIONE: Sono d'accordo con CASE è un modo per raggiungere risultato desiderato, ma sto piuttosto alla ricerca di una funzione a causa di prestazioni e altri motivi .

+5

Una funzione non sarà più veloce dell'istruzione CASE –

risposta

13

È possibile utilizzare una dichiarazione CASE ... ma perché non basta creare una tabella con un numero intero di età compresa tra 0 e 150, un varchar per l'età scritta e poi si può semplicemente aderire su quel

+3

+1 sulla nuova tabella e JOIN. un tavolo così piccolo si adatterebbe alla RAM e le prestazioni dovrebbero essere altrettanto buone di una funzione integrata. – Javier

+0

il link è rotto –

0

Se la tabella aggiuntiva non si adatta, è possibile scrivere la propria funzione per la traduzione.

Il vantaggio della funzione sql rispetto al caso è che è possibile utilizzarlo in vari luoghi e mantenere la logica della traduzione in un unico punto.

33

È possibile utilizzare IF() dove in Oracle si sarebbe utilizzato DECODE().

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

Prova questa:

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

Un'altra opzione MySQL che può sembrare più simile a Oracle di DECODE è un combinazione di FIELD e ELT. Nel codice che segue, FIELD() restituisce la posizione dell'elenco di argomenti della stringa corrispondente a Age. ELT() restituisce la stringa dall'elenco degli argomenti ELT nella posizione fornita da FIELD(). Per esempio, se è Age14, FIELD(Age, ...) rendimenti 2 perché 14 è il secondo argomento della FIELD (senza contare Age). Quindi, ELT(2, ...) restituisce 'Fourteen', che è il secondo argomento di ELT (senza contare l'argomento FIELD()). IFNULL restituisce il valore predefinito AgeBracket se nessuna corrispondenza con Age viene trovata nell'elenco.

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 

Mentre io non credo che questa sia la soluzione migliore per la domanda sia in termini di prestazioni o leggibilità è interessante come esplorazione di funzioni stringa di MySQL. Tieni presente che l'output di FIELD non sembra maiuscole e minuscole. I.e., FIELD('A','A') e FIELD('a','A') entrambi restituiscono 1.

1

L'esempio si traduce direttamente 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 

che si può scegliere di formattare per esempio in questo modo:

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

è possibile utilizzare se() al posto di decode() in MySQL come segue Questa query stamperà tutti anche fila id.

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