昨天在修改一个业务的过程中,想到了用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'), '未知' ) 姓名 来自 订单;

录音完成! ^_^~