2009-05-11 23 views
11

Estoy bastante seguro de que he visto esto en alguna parte, pero no puedo encontrar la terminología correcta, así que estoy teniendo problemas ...columna Condicional para consulta basada en otras columnas en MySQL

Digámosme tener una tabla con información del usuario (supongamos también que fue creada por alguien a quien se le paga más que a mí, por lo que modificar el esquema no es una opción.) Entre las diversas columnas de información del usuario hay columnas para DOB y título del trabajo. Quiero una consulta que, en base a lo que hay en esas columnas, incluirá una columna adicional llamada "Real_Title", por ejemplo:

User_id Job_Title DOB 
    joe_1  manager 01/01/1950 
    jim_1 associate 01/01/1970 
jill_1 associate 01/01/1985 
jane_1  manager 01/01/1975 

consulta:

SELECT User_id, Real_Title FROM users 
IF (YEAR(DOB) < 1980 AND Job_Title = "manager") 
    {Real_Title = "Old Fart"} 
ELSE IF (YEAR(DOB) < 1980 AND Job_Title = "associate") 
    {Real_Title = "Old Timer"} 
ELSE IF (YEAR(DOB) > 1980 AND Job_Title = "manager") 
    {Real_Title = "Eager Beaver"} 
ELSE IF (YEAR(DOB) > 1980 AND Job_Title = "associate") 
    {Real_Title = "Slacker"} 

sé lo anterior no es sólo mal pero también codificado realmente ineficiente, pero quería transmitir la idea.

¿Hay alguna manera, sin usar combinaciones, de rellenar una columna según la información en una o más columnas en la misma tabla?

Actualmente estoy usando algo en el script PHP después de obtener los resultados para canalizar esos resultados en los grupos que quiero, pero si se puede hacer en la consulta, eso haría que la consulta a otros scripts e idiomas más fácil.

Gracias!

+1

DOB <= 1980 Pedo de edad ?! – JohnB

+2

Verifique mi edad y observe que soy un viejo temporizador en el mejor de los casos. – Anthony

Respuesta

21
select User_id 
,case 
    when (YEAR(DOB) < 1980 AND Job_Title = "manager") then 'Old Fart' 
    when (YEAR(DOB) < 1980 AND Job_Title = "associate") then 'Old Timer' 
    when (YEAR(DOB) > 1980 AND Job_Title = "manager") then 'Eager Beaver' 
    when (YEAR(DOB) > 1980 AND Job_Title = "associate") then 'Slacker' 
    else 'nobody' 
end 
as Real_Title 
from users 
14

Si he entendido bien, creo que está buscando el CASE statement:

SELECT User_id, 
     (CASE 
      WHEN YEAR(DOB) < 1980 AND Job_Title = "manager" THEN "Old Fart" 
      WHEN YEAR(DOB) < 1980 AND Job_Title = "associate" THEN "Old Timer" 
      ... 
      ELSE "Unknown Title" 
     END) AS Real_Title 
FROM users; 
Cuestiones relacionadas