2009-05-11 3 views
11

Ich bin mir ziemlich sicher, dass ich das irgendwo gesehen habe, aber ich kann die richtige Terminologie nicht finden, so Ich habe Probleme ...Conditional Spalte für die Suche auf der Basis anderer Spalten in MySQL

Lasst uns sagen, dass ich eine Tabelle mit Benutzerinformationen haben (nehmen wir auch an, dass sie von jemandem erstellt wurde, der mehr bezahlt als ich, so ist das Ändern des Schemas keine Option.) Unter den verschiedenen Spalten der Benutzerinformationen befinden sich Spalten für DOB und Jobtitel. Ich möchte eine Abfrage, die, bezogen auf das, was in diesen Spalten ist, wird eine zusätzliche Spalte namens „Real_Title“, zum Beispiel umfassen:

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

Ich weiß, dass die oben nicht nur falsch, aber auch wirklich ineffizient codiert, aber ich wollte die Idee vermitteln.

Gibt es eine Möglichkeit, ohne eine Joins zu verwenden, eine Spalte basierend auf Informationen in einer oder mehreren anderen Spalten in derselben Tabelle aufzufüllen?

Momentan verwende ich etwas im PHP-Skript, nachdem die Ergebnisse erhalten wurden, um diese Ergebnisse in die gewünschten Gruppen zu kanalisieren, aber wenn es in der Abfrage durchgeführt werden kann, würde dies die Abfrage auf andere Skripte und Sprachen portieren viel einfacher.

Danke!

+1

DOB <1980 = Old Fart ?! – JohnB

+2

Überprüfen Sie mein Alter und beachten Sie, dass ich bestenfalls ein alter Timer bin. – Anthony

Antwort

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

Wenn ich richtig verstehe, ich glaube, du bist für die CASE statement suchen:

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;