2011-01-16 27 views
24

Estoy tratando de encontrar un equivalente de la función DECODE en MySQL. Funciona así:MySQL equivalente de la función DECODE en 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 función DECODE comparará el valor de la columna 'edad' con 13, 14, 15 .. y volver valor de cadena apropiada 'Trece', 'Catorce' .. y si coincide con nada, se devolverá el valor predeterminado de 'Adulto'.

¿Alguna idea que funcione en MySQL puede hacer este trabajo? Gracias.

ACLARACIÓN: Estoy de acuerdo en el uso de CASE es una manera de lograr el resultado deseado, pero estoy bien en busca de una función causa de rendimiento y otras razones .

+5

Una función no será más rápida que la instrucción CASE –

Respuesta

13

Usted puede utilizar una instrucción CASE ... sin embargo ¿por qué no simplemente crea una tabla con un número entero de edades comprendidas entre 0 y 150, un varchar para la era escrita y luego sólo pueden unirse en ese

+3

+1 en la tabla nueva y JOIN. una mesa tan pequeña encajaría en la RAM, y el rendimiento debería ser tan bueno como una función incorporada. – Javier

+0

el enlace está roto –

0

Si la tabla adicional no cabe, puede escribir su propia función para la traducción.

El plus de la función sql sobre el caso es que puede usarlo en varios lugares y mantener la lógica de traducción en un solo lugar.

33

Puedes usar IF() donde en Oracle hubieras usado DECODE().

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

Prueba esto:

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

Otra opción MySQL que pueden parecerse más a la de Oracle DECODE es una combinación de FIELD y ELT. En el código que sigue, FIELD() devuelve la posición de la lista de argumentos de la cadena que coincide con Age. ELT() devuelve la cadena de la lista de argumentos de ELT en la posición proporcionada por FIELD(). Por ejemplo, si Age es 14, FIELD(Age, ...) devuelve 2 porque 14 es el segundo argumento de FIELD (sin contar Age). Luego, ELT(2, ...) devuelve 'Fourteen', que es el segundo argumento de ELT (sin contar el argumento FIELD()). IFNULL devuelve el valor predeterminado AgeBracket si no se encuentra coincidencia con Age en la lista.

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 

Aunque no creo que esta es la mejor solución a la cuestión, ya sea en términos de rendimiento o la legibilidad es interesante como una exploración de las funciones de cadena de MySQL. Tenga en cuenta que la salida FIELD no parece ser sensible a mayúsculas y minúsculas. Es decir, FIELD('A','A') y FIELD('a','A') ambos devuelven 1.

1

El ejemplo se traduce directamente en:

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 

la que es posible que prefiera para dar formato, por ejemplo, de esta manera:

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

que puede utilizar si() en lugar de decodificación() en MySQL de la siguiente manera Esta consulta se imprimen todas las ID de fila.

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