DECODE函数根据参数的不同,既能实现if-then-else分支选择的功能,也能实现将str按照charset格式进行解码的功能。

if-then-else分支选择

命令格式

decode(<expression>, <search>, <result>[, <search>, <result>]...[, <default>])

参数说明

  • expression:必填。要比较的表达式。

  • search:必填。与expression进行比较的搜索项。

  • result:必填。searchexpression的值匹配时的返回值。

  • default:可选。如果所有的搜索项都不匹配,则返回default值,如果未指定,则返回NULL。

说明
  • 所有的result数据类型必须一致或为NULL。不一致的数据类型会返回报错。

  • 所有的searchexpression数据类型必须一致,否则会返回报错。

返回值说明

  • 如果匹配,返回result

  • 如果没有匹配,返回default

  • 如果没有指定default,返回NULL。

  • 如果search选项有重复且匹配时,会返回第一个值。

  • 通常,MaxCompute SQL在计算NULL=NULL时返回NULL,但在该函数中,NULL与NULL的值是相等的。

使用示例

例如表sale_detail的字段为shop_name string, customer_id string, total_price double,,包含数据如下。

+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s1         | c1          | 100.1       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
| s3         | c3          | 100.3       | 2013       | china      |
| null       | c5          | NULL        | 2014       | shanghai   |
| s6         | c6          | 100.4       | 2014       | shanghai   |
| s7         | c7          | 100.5       | 2014       | shanghai   |
+------------+-------------+-------------+------------+------------+

命令示例如下。

--当customer_id的值为c1时,返回Taobao;值为c2时,返回Alipay;值为c3时,返回Aliyun;值为NULL时,返回N/A;其他场景返回Others。
select
decode(customer_id,
'c1', 'Taobao',
'c2', 'Alipay',
'c3', 'Aliyun',
Null, 'N/A',
'Others') as result
from sale_detail;
--等效于如下语句。
if customer_id = c1 then
result := 'Taobao';
elsif customer_id = c2 then
result := 'Alipay';
elsif customer_id = c3 then
result := 'Aliyun';
...
else
result := 'Others';
end if;

返回结果如下。

+------------+
| result     |
+------------+
| Others     |
| Others     |
| Others     |
| Taobao     |
| Alipay     |
| Aliyun     |
+------------+

str按照charset格式进行解码

命令格式

string decode(binary <str>, string <charset>)

参数说明

  • str:必填。BINARY类型,待解码的字符串。

  • charset:必填。STRING类型,编码格式。取值范围为:UTF-8、UTF-16、UTF-16LE、UTF-16BE、ISO-8859-1、US-ASCII。

    说明

    目前ISO-8859-1和US-ASCII编码格式只支持对英文进行编码或解码,暂不支持中文。

返回值说明

返回STRING类型。strcharset值为NULL时,返回NULL。

使用示例

  • 示例1:将字符串“中文样例”按照UTF-8格式编码。命令示例如下。

    --编解码
    select decode(encode("中文样例","UTF-8"), "UTF-8");
    --返回
    +-----+
    | _c0 |
    +-----+
    | 中文样例 |
    +-----+
  • 示例2:任一输入参数为NULL。命令示例如下。

    --返回结果为NULL。
    select decode(encode("中文样例","UTF-8"), null);
    | _c0 |
    +-----+
    | NULL |
    +-----+

相关函数

DECODE函数属于其他函数,更多其他业务场景的函数请参见其他函数

DECODE函数也属于字符串函数,更多查找字符串、转换字符串格式的相关函数请参见字符串函数