MySQL相当于Oracle中的DECODE函数

时间:2011-01-16 15:12:45

标签: sql mysql database oracle

我试图在MySQL中找到相当于DECODE的函数。它的工作原理如下:

Select Name, DECODE(Age,
       13,'Thirteen',14,'Fourteen',15,'Fifteen',16,'Sixteen',
       17,'Seventeen',18,'Eighteen',19,'Nineteen',
       'Adult') AS AgeBracket
FROM Person

DECODE函数将比较'Age'列的值为13,14,15 ..并返回适当的字符串值'Thirteen','Fourteen'..如果它与nothing匹配,则默认值为'Adult'将被退回。

在MySQL中运行的任何想法都可以完成这项工作吗?感谢。

澄清:我同意使用CASE是实现预期结果的一种方法,但由于性能和其他原因,我宁愿寻找 功能

8 个答案:

答案 0 :(得分:42)

您可以使用IF()在Oracle中使用DECODE()的位置。

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

答案 1 :(得分:15)

您可以使用CASE语句...但是,为什么不创建一个包含0到150之间年龄的整数的表,一个用于写出年龄的varchar然后你可以加入该

答案 2 :(得分:9)

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 :(得分:9)

另一个看起来更像Oracle DECODE的MySQL选项是FIELDELT的组合。在下面的代码中,FIELD()返回与Age匹配的字符串的参数列表位置。 ELT()ELT提供的位置返回FIELD()参数列表中的字符串。例如,如果Age14,则FIELD(Age, ...)会返回2,因为14FIELD的第二个参数(不包括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

答案 4 :(得分:3)

该示例直接转换为:

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

答案 5 :(得分:0)

如果附加表格不合适,您可以编写自己的翻译功能。

sql函数的优点是,你可以在各个地方使用它,并将翻译逻辑保存在一个地方。

答案 6 :(得分:0)

你可以使用if()代替mySql中的decode(),如下所示   此查询将打印所有偶数ID行。

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

答案 7 :(得分:-6)

试试这个:

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