MySQL中与Oracle中DECODE函数等效的函数是什么?

48

我正在尝试在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'等,如果没有匹配项,则返回默认值'Adult'。

有没有什么MySQL函数可以完成这个任务?谢谢。

澄清:我同意使用CASE是实现所需结果的一种方式,但我更想要一个函数,因为考虑到性能和其他原因。


5
函数不会比CASE语句更快。 - user330315
Mysql的ELT似乎是DECODE的替代品:http://dev.mysql.com/doc/refman/4.1/en/string-functions.html#function_elt - JAR.JAR.beans
9个回答

60

您可以使用IF()函数,在Oracle中您将使用DECODE()函数。

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

6
这仅适用于布尔表达式,而不是像DECODE()那样任意长度的情况。 - krock
但是如果你想的话,你可以嵌套它吧? - Andy

25
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

19
你可以使用CASE语句...但为什么不创建一个表,包含0到150岁的整数和对应的年龄字符串,然后在该表上进行连接。

10

另一个类似于Oracle的DECODE函数的MySQL选项是FIELDELT的组合。在以下代码中,FIELD()返回与年龄匹配的字符串的参数列表位置。ELT()ELT参数列表返回由FIELD()提供的位置处的字符串。例如,如果Age14,则FIELD(Age, ...)返回2,因为14FIELD的第二个参数(不包括Age)。然后,ELT(2, ...)返回'Fourteen',这是ELT的第二个参数(不计算FIELD()参数)。如果在列表中找不到匹配Age,则IFNULL返回默认的AgeBracket

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


5
示例直接翻译为:
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

1
如果额外的表格不适合,您可以编写自己的翻译函数。
SQL函数相比于CASE语句的优点在于,您可以在各种地方使用它,并将翻译逻辑保留在一个地方。

0

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

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

0

虽然其他答案在没有NULL值的情况下可以正确工作,但这里提供了一个NULL安全的答案(因为这就是Oracle的DECODE实际上所做的):

SELECT
  Name, 
  CASE
    WHEN Age <=> 13 THEN 'Thirteen'
    WHEN Age <=> 14 THEN 'Fourteen'
    WHEN Age <=> 15 THEN 'Fifteen'
    ...
  END AS AgeBracket
FROM Person

值得注意的是,MySQL“兼容”的关系型数据库已经模仿了Oracle的函数:


-9

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接