基于MySQL中其他列的查询条件列

时间:2009-05-11 18:15:57

标签: mysql database syntax conditional

我很确定我已经在某个地方见过这个,但我找不到合适的术语,所以我遇到了麻烦......

假设我有一个包含用户信息的表(让我们假设它是由比我更多的人创建的,因此修改模式不是一种选择。)用户信息的各个列中有DOB的列和职称。我想要一个查询,根据这些列中的内容,将包含一个名为“Real_Title”的额外列,例如:

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

查询:

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

我知道上述内容不仅错误,而且编码效率也非常低,但我想了解这个想法。

有没有办法在不使用联接的情况下根据同一个表中一个或多个其他列中的信息填充列?

目前我在获取结果后使用PHP脚本中的内容将这些结果引导到我想要的组中,但如果可以在查询中完成,那么会将查询移植到其他脚本和语言中更容易。

谢谢!

2 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:14)

如果我理解正确,我认为您正在寻找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;