MySQL相当于Oracle中的DECODE函数

Ali*_*Ali 31 mysql sql 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 45

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

mysql> select if(emp_id=1,'X','Y') as test, emp_id from emps; 
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于布尔表达式,而不是像`DECODE()`那样的任意长度情况. (4认同)

SQL*_*ace 16

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

  • 在新表和JOIN上+1.这样一个小表适合RAM,性能应该和内置函数一样好. (3认同)

小智 11

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
Run Code Online (Sandbox Code Playgroud)


Set*_*ley 9

这看起来更像是甲骨文的另一个MySQL选项DECODE是组合FIELDELT.在下面的代码中,FIELD()返回与Age匹配的字符串的参数列表位置.ELT()返回由ELTs参数列表提供的位置的字符串FIELD().例如,如果Age14,则FIELD(Age, ...)返回2因为14FIELD(不计数Age)的第二个参数.然后,ELT(2, ...)返回'Fourteen',这是ELT(不计算FIELD()参数)的第二个参数.如果在列表中找不到匹配项,则IFNULL返回默认值.AgeBracketAge

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
Run Code Online (Sandbox Code Playgroud)

虽然我认为无论是在性能还是可读性方面,这都是问题的最佳解决方案,但作为对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
Run Code Online (Sandbox Code Playgroud)

您可能更喜欢这样格式化:

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
Run Code Online (Sandbox Code Playgroud)