DECODE 函数
DECODE 表达式将一个特定值替换为另一个特定值或默认值,具体取决于等式条件的结果。此操作等同于简单 CASE 表达式或 IF-THEN-ELSE 语句的操作。
语法
DECODE ( expression, search, result [, search, result ]... [ ,default ] )
此类表达式对于将存储在表中的缩写或代码替换为报表所需的有意义的业务值非常有用。
参数
- expression
-
要比较的值的源,如表中的列。
- 搜索
-
与源表达式比较的目标值,如数字值或字符串。搜索表达式的计算结果必须为一个固定值。您无法指定计算结果为值范围(如
age between 20 and 29
)的表达式;您需要为要替换的每个值指定单独的搜索/结果对。搜索表达式的所有实例的数据类型必须相同或兼容。expression 和 search 参数也必须兼容。
- result
-
查询在表达式匹配搜索值时返回的替换值。您必须在 DECODE 表达式中包含至少一个搜索/结果对。
结果表达式的所有实例的数据类型必须相同或兼容。result 和 default 参数也必须兼容。
- 默认值
-
搜索条件失败时用于案例的可选默认值。如果您未指定默认值,则 DECODE 表达式返回 NULL。
使用说明
如果 expression 值和 search 值都为 NULL,则 DECODE 结果为对应的 result 值。有关此函数的使用的说明,请参阅“示例”部分。
以此方式使用时,DECODE 类似于 NVL2 函数,但存在一些区别。有关这些区别的说明,请参阅 NVL2 使用说明。
示例
当值 2008-06-01
存在于 datetable 的 caldate 列中时,以下示例会将该值替换为 June 1st, 2008
。此示例将所有其他 caldate 值替换为 NULL。
select decode(caldate, '2008-06-01', 'June 1st, 2008') from datetable where month='JUN' order by caldate; case ---------------- June 1st, 2008 ... (30 rows)
以下示例使用 DECODE 表达式将 CATEGORY 表中的 5 个缩写的 CATNAME 列转换为全名并将该列中的其他值转换为 Unknown
。
select catid, decode(catname, 'NHL', 'National Hockey League', 'MLB', 'Major League Baseball', 'MLS', 'Major League Soccer', 'NFL', 'National Football League', 'NBA', 'National Basketball Association', 'Unknown') from category order by catid; catid | case -------+--------------------------------- 1 | Major League Baseball 2 | National Hockey League 3 | National Football League 4 | National Basketball Association 5 | Major League Soccer 6 | Unknown 7 | Unknown 8 | Unknown 9 | Unknown 10 | Unknown 11 | Unknown (11 rows)
使用 DECODE 表达式在 VENUESEATS 列中查找带 NULL 值的科罗拉多州和内华达州的 5 个场地;将这些 NULL 值转换为零。如果 VENUESEATS 列不为 NULL,则返回 1 作为结果。
select venuename, venuestate, decode(venueseats,null,0,1) from venue where venuestate in('NV','CO') order by 2,3,1; venuename | venuestate | case ------------------------------+----------------+----------- Coors Field | CO | 1 Dick's Sporting Goods Park | CO | 1 Ellie Caulkins Opera House | CO | 1 INVESCO Field | CO | 1 Pepsi Center | CO | 1 Ballys Hotel | NV | 0 Bellagio Hotel | NV | 0 Caesars Palace | NV | 0 Harrahs Hotel | NV | 0 Hilton Hotel | NV | 0 ... (20 rows)