DECODE函數根據參數的不同,既能實現if-then-else
分支選擇的功能,也能實現將str按照charset格式進行解碼的功能。
if-then-else
分支選擇
命令格式
decode(<expression>, <search>, <result>[, <search>, <result>]...[, <default>])
參數說明
expression:必填。要比較的運算式。
search:必填。與expression進行比較的搜尋項。
result:必填。search和expression的值匹配時的傳回值。
default:可選。如果所有的搜尋項都不匹配,則返回default值,如果未指定,則返回NULL。
所有的result資料類型必須一致或為NULL。不一致的資料類型會返回報錯。
所有的search和expression資料類型必須一致,否則會返回報錯。
傳回值說明
如果匹配,返回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類型。str或charset值為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函數也屬於字串函數,更多尋找字串、轉換字串格式的相關函數請參見字串函數。