SQL 方言通

首页 / 条件、空值和类型转换

DECODE 多值匹配

DECODE(expr, search1, result1, ..., default) 按值匹配返回结果,相当于简单的 CASE 表达式。MaxCompute 和 Spark 3.2 起支持这种写法;Hive 和 Flink 的 DECODE 是按字符集解码二进制,含义完全不同;其他引擎要改写为 CASE。

各引擎写法 · 迁移注意事项 · 示例

各引擎写法

引擎支持写法说明依据
MaxCompute支持DECODE(expression, search, result[, search, result]...[, default])没有匹配且没有 default 时返回 NULL。所有 result 的类型必须一致,search 与 expression 的类型也必须一致,否则报错。在 DECODE 中 NULL 与 NULL 视为相等。官方文档
Hologres需改写CASE expr WHEN search THEN result ... ELSE default END条件函数文档中没有 DECODE,用 CASE 改写。官方文档
StarRocks需改写CASE expr WHEN search THEN result ... ELSE default END函数列表中没有按值匹配的 DECODE,只有 base64、hex 等解码函数,用 CASE 改写。官方文档
Doris需改写CASE expr WHEN search THEN result ... ELSE default END条件函数中没有 DECODE,用 CASE 改写。官方文档
Hive需改写CASE expr WHEN search THEN result ... ELSE default ENDHive 的 decode(binary bin, string charset) 是按字符集把二进制解码为字符串,不能做多值匹配,需要用 CASE 改写。官方文档
Spark SQL支持decode(expr, search, result [, search, result ] ... [, default])多值匹配写法 3.2.0 起支持。没有匹配且省略 default 时返回 NULL。同名的 decode(bin, charset) 用于按字符集解码。官方文档
Flink SQL需改写CASE expr WHEN search THEN result ... ELSE default ENDDECODE(binary, string) 是按字符集解码二进制,不能做多值匹配,需要用 CASE 改写。官方文档

迁移注意事项

示例

把状态码翻译成中文

MaxCompute
SELECT DECODE(status, 1, '待支付', 2, '已支付', '其他') AS status_name FROM orders;
Hologres
SELECT CASE status WHEN 1 THEN '待支付' WHEN 2 THEN '已支付' ELSE '其他' END AS status_name FROM orders;
StarRocks
SELECT CASE status WHEN 1 THEN '待支付' WHEN 2 THEN '已支付' ELSE '其他' END AS status_name FROM orders;
Doris
SELECT CASE status WHEN 1 THEN '待支付' WHEN 2 THEN '已支付' ELSE '其他' END AS status_name FROM orders;
Hive
SELECT CASE status WHEN 1 THEN '待支付' WHEN 2 THEN '已支付' ELSE '其他' END AS status_name FROM orders;
Spark SQL
SELECT decode(status, 1, '待支付', 2, '已支付', '其他') AS status_name FROM orders;
Flink SQL
SELECT CASE status WHEN 1 THEN '待支付' WHEN 2 THEN '已支付' ELSE '其他' END AS status_name FROM orders;

同类函数

最后核对日期: