昨天在修改一个业务的过程中,想到了用DECODE()来达到效果。转眼间发现当前使用的是Mysql库。经过咨询,最终使用ELT()、FIELD()、IFNULL()函数来实现需求。现在把它记录下来。
语法:
ELT(n,str1,str2,str3,...):如果n=1,则返回str1,如果n=2,则返回str2,依此类推。如果 n 小于 1 或大于参数数量,则返回 NULL。 ELT()是FIELD()的功能补充函数。
mysql>SELECTELT(3,'你好','晕','测试','世界 ' ); +------------------------------------------------------ ----------+ | ELT(3,'你好',' 晕','测试','世界')| +------------------------------------------------------ ----------+ |测试| +------------------------------------------------------ ----------+ 1行中组 mysql>
FIELD(str,str1,str2,str,str3,str4...):返回str在以下参数列(str1,str2,str,str3,str4...)中的索引,起始from 起始索引为 1。如果在参数列中未找到 str,则返回 0。
mysql>SELECT字段('halo','你好','halo','测试', '世界') ; +------------------------------------------------------ --- -----+ |场('晕','你好','晕','测试','世界 ')| +------------------------------------------------------ --- -----+ | 2 | +------------------------------------------------------ --- -----+ 1行中组 mysql>
IFNULL(expr1,expr2):如果expr1为NULL,则返回expr2,如果expr1不为NULL,则返回expr1。 IFNULL() 返回数字或字符串值,具体取决于使用它的上下文。
mysql> SELECT IFNULL(NULL,8); +----------------+ | IFNULL(NULL,8) | +----------------+ | 8 | +----------------+ 1行中组 mysql>SELECT IFNULL('你好','世界'); +--------------------------+ | IFNULL('你好','世界') | +--------------------------+ |你好| +--------------------------+ 1行中组 mysql> SELECT IFNULL(null,'世界'); +----------------------+ | IFNULL(null,'世界')| +----------------------+|世界| +----------------------+ 1行中组 mysql>
应用:
例如:订单记录存储订单的来源类型代码。现在需要在页面列表中显示源名称。源信息不存储在单独的表中。现在需要修改查询语句才能达到目的:
在Oracle中,我们可以使用decode()函数来获取源名称:decode(condition, value 1, return value 1, value 2, return value 2..., default value);
在Mysql中,我们需要ELT()和FIELD()来实现,必要时还会使用IFNULL()来实现最终的效果。对于上面的需求,我们可以使用下面的sql来实现:
SELECT *,IFNULL(ELT(FIELD(类型,'1','2' ,'3','4'),'源A', '来源B' , '来源 C','来源 D'), '未知' ) 姓名 来自 订单;
录音完成! ^_^~