2009-05-11 25 views
11

Sono abbastanza sicuro che ho visto da qualche parte, ma non riesco a trovare la giusta terminologia così Ho problemi ...colonna condizionale per query basata su altre colonne in MySQL

Diciamo che avere una tabella con le informazioni utente (supponiamo anche che sia stata creata da qualcuno che viene pagato più di me, quindi la modifica dello schema non è un'opzione.) Tra le varie colonne di informazioni utente ci sono le colonne per DOB e titolo del lavoro. Voglio una query che, sulla base di ciò che è in quelle colonne, includerà una colonna aggiuntiva denominata "Real_Title", per esempio:

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 

query:

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"} 

So quanto sopra è non solo sbagliato ma anche codificato davvero inefficiente, ma volevo far passare l'idea.

C'è un modo, senza utilizzare join, per popolare una colonna in base alle informazioni in una o più altre colonne nella stessa tabella?

Attualmente sto usando qualcosa nello script PHP dopo che i risultati sono stati ottenuti per incanalare quei risultati nei gruppi che voglio, ma se può essere fatto nella query, ciò renderebbe il porting della query ad altri script e linguaggi molto più facile.

Grazie!

+1

DOB <1.980 = vecchio rudere ?! – JohnB

+2

Controlla la mia età e nota che sono un vecchio timer al massimo. – Anthony

risposta

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

Se ho capito bene, penso che stai cercando il 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; 
Problemi correlati