Условный столбец для запроса на основе других столбцов в MySQL - PullRequest
12 голосов
/ 11 мая 2009

Я почти уверен, что видел это где-то, но не могу найти правильную терминологию, поэтому у меня проблемы ...

Допустим, у меня есть таблица с пользовательской информацией (также предположим, что она была создана кем-то, кому платят больше, чем мне, поэтому изменение схемы не вариант). Среди различных столбцов пользовательской информации есть столбцы для 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 ]

25 голосов
/ 11 мая 2009
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 голосов
/ 11 мая 2009

Если я правильно понимаю, я думаю, что вы ищете CASE заявление :

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...