文章目录



第五十一章 SQL函数 DECODE

计算给定表达式并返回指定值的函数。

大纲

DECODE(expr {,search,result}[,default])

参数


  • ​expr​​ - 要解码的表达式。
  • ​search​​ - 要与Expr进行比较的值。
  • ​result​​​ - ​​Expr​​匹配搜索时返回的值。
  • ​default​​​ - 可选-如果​​expr​​与任何搜索都不匹配,则返回默认值。

描述

可以指定多个搜索和结果对,以逗号分隔。您可以指定一个默认值。​​DECODE​​​表达式(包括​​EXPR​​​、​​SEARCH​​​、​​RESULT​​​和​​DEFAULT​​​)中的最大参数数约为​​100​​。搜索、结果和默认值可以从表达式派生。

为了计算​​DECODE​​​表达式,会逐个将​​expr​​与每个搜索值进行比较:


  • 如果​​expr​​​等于​​search​​ ,则返回相应的结果。
  • 如果​​expr​​​不等于​​search​​​ ,则返回默认值,如果省略默认值,则返回​​NULL​​。

仅在将​​search​​​与​​Expr​​​进行比较之前计算每个​​search​​​,而不是在将所有​​search​​​与​​Expr​​​进行比较之前评估所有​​search​​​。因此,如果上一次搜索等于​​EXPR​​,不会对搜索求值。

在​​DECODE​​​表达式中,将两个​​NULL​​​视为等效。如果​​expr​​​为​​NULL​​​,则将返回同样为​​NULL​​的第一次搜索结果。

请注意,为了与Oracle兼容,支持解码。

返回值的数据类型

​DECODE​​​返回第一个结果参数的数据类型。如果无法确定第一个结果参数的数据类型,则​​DECODE​​​返回​​VARCHAR​​​。对于数值,​​DECODE​​从所有可能的结果参数值返回最大长度、精度和小数位数。

如果结果和默认值的数据类型不同,则返回的数据类型是与所有可能的返回值最兼容的类型,即具有最高数据类型优先级的数据类型。例如,如果结果是整数,默认值是小数,则​​DECODE​​返回一个带有数据类型数字的值。这是因为数字是与两者兼容的最高优先级的数据类型。

示例

下面的例子将​​13​​到​​19​​岁的年龄​​“decodes”​​为​​“Teen”​​;

默认为​​“Adult”​​:

SELECT Name,Age,DECODE(Age,
13,'Teen',14,'Teen',15,'Teen',16,'Teen',
17,'Teen',18,'Teen',19,'Teen',
'Adult') AS AgeBracket
FROM Sample.Person
WHERE Age > 12

第五十一章 SQL函数 DECODE_数据库

下面的示例对空值进行解码。

如果​​FavoriteColors​​没有值,​​DECODE​​将它替换为字符串​​' no Preference '​​;

否则,它返回​​FavoriteColors​​值:

SELECT Name,DECODE(FavoriteColors,
NULL,'No Preference',
$LISTTOSTRING(FavoriteColors,'^')) AS ColorPreference
FROM Sample.Person
ORDER BY Name

第五十一章 SQL函数 DECODE_搜索_02

下面的示例解码颜色首选参数。如果此人只有一种最喜欢的颜色,则该颜色名称将被字母缩写替换。如果用户有多个最喜欢的颜色,则​​DECODE​​​返回​​FavoriteColors​​值:

SELECT Name,DECODE(FavoriteColors,
$LISTBUILD('Red'),'R',
$LISTBUILD('Orange'),'O',
$LISTBUILD('Yellow'),'Y',
$LISTBUILD('Green'),'G',
$LISTBUILD('Blue'),'B',
$LISTBUILD('Purple'),'V',
$LISTBUILD('White'),'W',
$LISTBUILD('Black'),'K',
$LISTTOSTRING(FavoriteColors,'^'))
FROM Sample.Person
WHERE FavoriteColors IS NOT NULL
ORDER BY FavoriteColors

第五十一章 SQL函数 DECODE_sql_03

请注意,​​ORDER BY​​子句按原始字段值排序。以下示例按解码值排序:

SELECT Name,DECODE(FavoriteColors,
$LISTBUILD('Red'),'R',
$LISTBUILD('Orange'),'O',
$LISTBUILD('Yellow'),'Y',
$LISTBUILD('Green'),'G',
$LISTBUILD('Blue'),'B',
$LISTBUILD('Purple'),'V',
$LISTBUILD('White'),'W',
$LISTBUILD('Black'),'K',
$LISTTOSTRING(FavoriteColors,'^')) AS ColorCode
FROM Sample.Person
WHERE FavoriteColors IS NOT NULL
ORDER BY ColorCode

第五十一章 SQL函数 DECODE_database_04

下面的示例将​​“Employee”​​记录中的​​“Company code”​​字段中的数字代码进行解码,并返回相应的部门名称。

如果员工的公司代码不是​​1​​到​​10​​,​​DECODE​​返回默认的​​“Admin(non-tech)”​​:

SELECT Name,
DECODE (Company,
1, 'TECH MARKETING', 2, 'TECH SALES', 3, 'DOCUMENTATION',
4, 'BASIC RESEARCH', 5, 'SOFTWARE DEVELOPMENT', 6, 'HARDWARE DEVELOPMENT',
7, 'QUALITY TESTING', 8, 'FIELD SUPPORT', 9, 'PHONE SUPPORT',
10, 'TECH TRAINING',
'Admin (non-tech)') AS TechJobs
FROM Sample.Employee WHERE Company<10

第五十一章 SQL函数 DECODE_搜索_05

该表达式使用​​Company​​作为​​expr​​参数,并使用​​10​​对搜索和结果参数。

默认参数为​​“Admin(non-tech)”​​。