Подтвердить что ты не робот

MySQL эквивалент функции DECODE в Oracle

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

4b9b3361

Ответ 1

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

mysql> select if(emp_id=1,'X','Y') as test, emp_id from emps; 

Ответ 2

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

Ответ 3

Другой вариант 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.

Ответ 4

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

mysql> select id, name from employee where id in
-> (select if(id%2=0,id,null) from employee);

Ответ 9

Выберите имя, ELT (Возраст-12, "Тринадцать", "Четырнадцать", "Пятнадцать", "Шестнадцать",       "Семнадцать", "Восемнадцать", "Девятнадцать", "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Только для взрослых" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "для взрослых" ,       "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" , "Взрослый" ) AS AgeBracket FROM Person