语法:
DECODE(expr, search, result [, search, result ]... [, default ] )
应用:
DECODE函数将每一个expr和search的值做比较。如果expr的值与search的值相等,Oracle数据库就会返回相应的result。如果找不到匹配的值,Oracle返回default。如果没有default,Oracle返回null值。
参数可以是任意数值类型(NUMBER,BINARY_FLOAT, or BINARY_DOUBLE)和字符型。
1、如果expr和search是字符型,Oracle通过非填充的比较语义来比较它们。expr,search和result可以是CHAR, VARCHAR2, NCHAR, or NVARCHAR2中任意类型的数据类型。字符串返回的是VARCHAR2型数据类型,它和第一个result参数处于同一个字符集。
2、如果第一个search-result对是数值型的,Oracle会比对所有的search-result表达式以及expr来决定具有最高优先级的参数数值,并隐式转换其余参数的数据类型以及返回值的数据类型。
search、result和default的值可以由表达式运算得来。Oracle数据库使用的是短路评价。也就是说,数据库只在将每个search值和expr值对比之前才评价search的值,而不是在与expr对比之前评价所有的search值。
Oracle在比对之前自动将expr和每个search的值转换成第一个search值的数据类型,并自动将返回值转换成与第一个result相同的数据类型。如果第一个result有CHAR数据类型或者为NULL,Oracle会将返回值转换成VARCHAR2类型。
在DECODE函数里,Oracle将两个null值认为是相等的。如果expr和第一个search同时为空,那Oracle会返回所有所有的result。
DECODE所能容纳的最大参数数目是255个,这其中包括expr,search,result以及default。
例子:
例子解码warehouse_id的值,如果warehouse_id为1,返回Southlake,为2返回San Francisco等等。如果warehouse_id不是1,2,3,4中的任意一个,函数返回Non domestic。
SELECT product_id,
DECODE (warehouse_id, 1, 'Southlake',
2, 'San Francisco',
3, 'New Jersey',
4, 'Seattle',
'Non domestic')
"Location of inventory" FROM inventories
WHERE product_id < 1775;