Условный столбец для запроса на основе других столбцов в MySQL
Я уверен, что видел это где-то, но я не могу найти правильную терминологию, поэтому у меня возникают проблемы...
Скажем, у меня есть таблица с информацией о пользователе (пусть также предположим, что она была создана кем-то, кто получает больше, чем меня, поэтому изменение схемы не является вариантом.) Среди различных столбцов информации о пользователе - столбцы для 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 script после того, как будут получены результаты для передачи этих результатов в группы, которые я хочу, но если это можно сделать в запросе, это сделает перенос запроса на другие скрипты и языков намного проще.
Спасибо!
Ответы
Ответ 1
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
Ответ 2
Если я правильно понимаю, я думаю, что вы ищете оператор 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;