Oracle中DECODE函数的MySQL等效函数

p8h8hvxi  于 2022-12-03  发布在  Mysql
关注(0)|答案(9)|浏览(142)

我试图在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函数将“年龄”列的值与13、14、15..进行比较,并返回相应的字符串值“十三”、“十四..",如果没有匹配项,则返回默认值”成人“。
有什么想法在MySQL的函数可以做这项工作?谢谢。
澄清:我同意使用CASE是实现预期结果的一种方法,但由于性能和其他原因,我更愿意寻找***函数***。

ncgqoxb0

ncgqoxb01#

您可以使用CASE语句......但是,为什么不创建一个表,其中使用整数表示0到150之间的年龄,使用varchar表示写出的年龄,然后您可以在该表上进行连接

kwvwclae

kwvwclae2#

另一个可能看起来更像Oracle的DECODE的MySQL选项是FIELDELT的组合。在下面的代码中,FIELD()返回与Age匹配的字符串的参数列表位置。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

rpppsulh

rpppsulh3#

该示例直接转换为:

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
ncecgwcz

ncecgwcz4#

如果附加表不适合,您可以编写自己的函数进行转换。
sql函数相对于case的优点是,你可以在不同的地方使用它,而将翻译逻辑保持在一个地方。

vddsk6oq

vddsk6oq5#

您可以在mySql中使用if()来代替decode(),如下所示。

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

qzwqbdag6#

如果不涉及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
hyrbngr7

hyrbngr77#

试试这个:

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
smtd7mpg

smtd7mpg8#

您可以在Oracle中使用DECODE()的地方使用IF()

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

dxxyhpgq9#

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

相关问题