2009-05-11 16 views
11

Jestem pewien, że widziałem to gdzieś, ale nie mogę znaleźć właściwą terminologię więc mam problemy ...Warunkowe kolumny dla kwerendy oparte na innych kolumnach w MySQL

Powiedzmy, że mieć tabelę z informacjami o użytkowniku (załóżmy też, że został stworzony przez kogoś, kto zarabia więcej niż ja, więc modyfikowanie schematu nie jest opcją.) Wśród różnych kolumn informacji o użytkowniku są kolumny DOB i tytuł pracy. Chcę zapytać, że w oparciu o to, co jest w tych kolumnach, będzie zawierać dodatkową kolumnę o nazwie „Real_Title”, na przykład:

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 

zapytania:

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

Znam powyżej jest nie tylko źle, ale także zakodowane naprawdę nieskuteczne, ale chciałem wpaść na pomysł.

Czy istnieje sposób, bez użycia połączeń, do wypełnienia kolumny na podstawie informacji w jednej lub więcej innych kolumn w tej samej tabeli?

Obecnie używam czegoś w skrypcie PHP po uzyskaniu wyników, aby przekazać te wyniki do grup, które chcę, ale jeśli można to zrobić w zapytaniu, spowoduje to przeniesienie zapytania do innych skryptów i języków dużo łatwiej.

Dzięki!

+1

DOB <1980 = Old Fart ?! – JohnB

+2

Sprawdź mój wiek i zauważ, że jestem w najlepszym razie starszym zegarkiem. – Anthony

Odpowiedz

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

Jeśli dobrze rozumiem, myślę, że szukasz na 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; 
Powiązane problemy