Ответ 1
Вы можете использовать IF()
, где в Oracle вы использовали бы DECODE()
.
mysql> select if(emp_id=1,'X','Y') as test, emp_id from emps;
Я пытаюсь найти эквивалент функции DECODE в MySQL. Он работает следующим образом:
Select Name, DECODE(Age,
13,'Thirteen',14,'Fourteen',15,'Fifteen',16,'Sixteen',
17,'Seventeen',18,'Eighteen',19,'Nineteen',
'Adult') AS AgeBracket
FROM Person
Функция DECODE сравнивает значение столбца "Возраст" с 13, 14, 15.. и возвращает соответствующее строковое значение "Тринадцать", "Четырнадцать".. и если оно не соответствует ничему, тогда значение по умолчанию "Взрослый" означает, будет возвращен.
Любые идеи, которые работают в MySQL, могут выполнять эту работу? Спасибо.
ПОДТВЕРЖДЕНИЕ: Я согласен с использованием CASE - это один из способов достижения желаемого результата, но я предпочитаю функцию из-за производительности и других причин.
Вы можете использовать IF()
, где в Oracle вы использовали бы DECODE()
.
mysql> select if(emp_id=1,'X','Y') as test, emp_id from emps;
Вы можете использовать оператор CASE... однако почему бы вам просто не создать таблицу с целым числом в течение 0 и 150, varchar для выписанного возраста, а затем вы можете просто присоединиться к этому
Другой вариант MySQL, который может больше похож на Oracle DECODE
, представляет собой комбинацию FIELD
и ELT
. В следующем коде FIELD()
возвращает позицию списка аргументов строки, которая соответствует Age. ELT()
возвращает строку из списка аргументов ELT
в позиции, предоставленной FIELD()
. Например, если Age
- 14
, FIELD(Age, ...)
возвращает 2
, потому что 14
является вторым аргументом FIELD
(не считая Age
). Затем ELT(2, ...)
возвращает 'Fourteen'
, который является вторым аргументом ELT
(не считая аргумента FIELD()
). IFNULL
возвращает значение по умолчанию AgeBracket
, если в списке не найдено соответствия Age
.
Select Name, IFNULL(ELT(FIELD(Age,
13, 14, 15, 16, 17, 18, 19),'Thirteen','Fourteen','Fifteen','Sixteen',
'Seventeen','Eighteen','Nineteen'),
'Adult') AS AgeBracket
FROM Person
Хотя я не думаю, что это лучшее решение вопроса с точки зрения производительности или удобочитаемости, это интересно как исследование строковых функций MySQL. Имейте в виду, что вывод FIELD
не чувствителен к регистру. I.e., FIELD('A','A')
и FIELD('A','A')
возвращаются 1
.
Select Name,
case
when Age = 13 then 'Thirteen'
when Age = 14 then 'Fourteen'
when Age = 15 then 'Fifteen'
when Age = 16 then 'Sixteen'
when Age = 17 then 'Seventeen'
when Age = 18 then 'Eighteen'
when Age = 19 then 'Nineteen'
else 'Adult'
end as AgeBracket
FROM Person
Mysql ELT, по-видимому, является альтернативой DECODE:
http://dev.mysql.com/doc/refman/4.1/en/string-functions.html#function_elt
Пример переводится непосредственно на:
Select Name, CASE Age
WHEN 13 then 'Thirteen' WHEN 14 then 'Fourteen' WHEN 15 then 'Fifteen' WHEN 16 then 'Sixteen'
WHEN 17 then 'Seventeen' WHEN 18 then 'Eighteen' WHEN 19 then 'Nineteen'
ELSE 'Adult' END AS AgeBracket
FROM Person
который вы, возможно, предпочитаете форматировать, например. например:
Select Name,
CASE Age
when 13 then 'Thirteen'
when 14 then 'Fourteen'
when 15 then 'Fifteen'
when 16 then 'Sixteen'
when 17 then 'Seventeen'
when 18 then 'Eighteen'
when 19 then 'Nineteen'
else 'Adult'
END AS AgeBracket
FROM Person
Если дополнительная таблица не подходит, вы можете написать свою собственную функцию для перевода.
Плюсом функции sql over case является то, что вы можете использовать его в разных местах и сохранять логику перевода в одном месте.
вы можете использовать if() вместо decode() в mySql следующим образом Этот запрос будет печатать всю четную строку id.
mysql> select id, name from employee where id in
-> (select if(id%2=0,id,null) from employee);
Выберите имя, ELT (Возраст-12, "Тринадцать", "Четырнадцать", "Пятнадцать", "Шестнадцать", "Семнадцать", "Восемнадцать", "Девятнадцать", "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" ) AS AgeBracket FROM Person