我试图在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是实现预期结果的一种方法,但由于性能和其他原因,我更愿意寻找***函数***。
9条答案
按热度按时间ncgqoxb01#
您可以使用CASE语句......但是,为什么不创建一个表,其中使用整数表示0到150之间的年龄,使用varchar表示写出的年龄,然后您可以在该表上进行连接
kwvwclae2#
另一个可能看起来更像Oracle的
DECODE
的MySQL选项是FIELD
和ELT
的组合。在下面的代码中,FIELD()
返回与Age匹配的字符串的参数列表位置。ELT()
返回ELT
的参数列表中FIELD()
提供的位置处的字符串。例如,如果Age
是14
,则FIELD(Age, ...)
返回2
,因为14
是FIELD
的第二个参数(不包括Age
)。然后,ELT(2, ...)
返回'Fourteen'
,这是ELT
的第二个参数(不计算FIELD()
参数)。如果在清单中找不到与Age
相符的项目,则IFNULL
会传回预设值AgeBracket
。虽然我不认为这是解决这个问题的最佳方案,无论是在性能还是可读性方面,但作为对MySQL字符串函数的探索,这是很有趣的。请记住,
FIELD
的输出似乎不区分大小写。即,FIELD('A','A')
和FIELD('a','A')
都返回1
。rpppsulh3#
该示例直接转换为:
您可能希望将其格式设置为如下所示:
ncecgwcz4#
如果附加表不适合,您可以编写自己的函数进行转换。
sql函数相对于case的优点是,你可以在不同的地方使用它,而将翻译逻辑保持在一个地方。
vddsk6oq5#
您可以在mySql中使用if()来代替decode(),如下所示。
qzwqbdag6#
如果不涉及
NULL
值,其他答案都能正确回答,但这里有一个NULL
安全答案(因为这正是Oracle的DECODE
* 真正 * 所做的):hyrbngr77#
试试这个:
smtd7mpg8#
您可以在Oracle中使用
DECODE()
的地方使用IF()
。dxxyhpgq9#