MySQL эквивалент функции DECODE в Oracle - PullRequest
30 голосов
/ 16 января 2011

Я пытаюсь найти эквивалент функции 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 - это один из способов достижения желаемого результата, но я скорее ищу функцию из-за производительности и других причин.

Ответы [ 8 ]

42 голосов
/ 23 мая 2012

Вы можете использовать IF(), где в Oracle вы бы использовали DECODE().

mysql> select if(emp_id=1,'X','Y') as test, emp_id from emps; 
15 голосов
/ 16 января 2011

Вы можете использовать оператор CASE ... однако почему бы вам просто не создать таблицу с целым числом для возрастов от 0 до 150, varchar для выписанного возраста, а затем вы можете просто присоединиться к этому

9 голосов
/ 03 ноября 2014

Еще одна опция 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 не чувствителен к регистру.То есть FIELD('A','A') и FIELD('a','A') оба возвращают 1.

9 голосов
/ 25 октября 2014
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
3 голосов
/ 22 апреля 2016

Пример переводит непосредственно в:

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
0 голосов
/ 06 октября 2017

Вы можете использовать if () вместо decode () в mySql следующим образом. Этот запрос выведет всю четную строку идентификатора.

mysql> select id, name from employee where id in
-> (select if(id%2=0,id,null) from employee);
0 голосов
/ 14 января 2014

Попробуйте это:

Select Name, ELT(Age-12,'Thirteen','Fourteen','Fifteen','Sixteen',
   'Seventeen','Eighteen','Nineteen','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult',
   'Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult','Adult') AS AgeBracket FROM Person
0 голосов
/ 17 января 2011

Если дополнительная таблица не подходит, вы можете написать собственную функцию для перевода.

Плюс функции sql над case является то, что вы можете использовать ее в разных местах и ​​хранить логику перевода в одном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...