- 论坛徽章:
- 11
|
DECODE的用法..
DECODE 表达式和 CASE 表达式类似,它能根据指定列中找到的值打印不同的结果。
阅读语法图跳过直观语法图DECODE 函数:
.-,---------------------------.
V | .-,--NULL------.
|--DECODE--(--expr--,----when_expr--,--+-then_expr-+-+--+--------------+--)--|
'-NULL------' '-,--else_expr-'
元素 描述 限制 语法
expr, else_expr,
then_expr,
when_expr 值和数据类型可以评估的表达式 when_expr 和 expr 的数据类型必须一致,then_expr 和 else_expr 的数据类型也必须一致。when_expr 的值不能是 NULL。 表达式,
表达式页
表达式 expr、when_expr 和 then_expr 是必需的。DECODE 对 expr 求值并把它和 when_expr 比较。如果 when_expr 的值和 expr 的值匹配,那么 DECODE 返回 then_expr。
表达式 when_expr 和 then_expr 是一个表达式对,可以在 DECODE 函数中指定任意数量的表达式对。在所有情况下,DECODE 把表达式对中的第一个成员和 expr 进行比较,如果第一个成员和 expr 匹配,就返回第二个成员。
如果没有表达式和 expr 匹配,DECODE 就返回 else_expr。如果没有表达式和 expr 匹配而且没有指定 else_expr,那么 DECODE 返回 NULL。
可以为参数指定任何数据类型,但是有两个限制:
* 所有 when_expr 的实例必须有相同的数据类型,或者必须存在一个公共兼容类型。所有 when_expr 的实例也必须具有和 expr 相同(或兼容)的数据类型。
* 所有 then_expr 的实例必须有相同的数据类型,或者必须存在一个公共兼容类型。所有 then_expr 的实例也必须具有和 else_expr 相同(或兼容)的数据类型。
假设一个用户要把 students 表 evaluation 列的描述值在输出中转换成数字值。下表给出了 students 表的内容。
firstname evaluation firstname evaluation
Edward Great Mary Good
Joe Not done Jim Poor
现在用户输入带有 DECODE 函数的查询,将 evaluation 列中的描述性值转换为相等的数字值:
SELECT firstname, DECODE(evaluation,
'Poor', 0,
'Fair', 25,
'Good', 50,
'Very Good', 75,
'Great', 100,
-1) as grade
FROM students
下表给出了这个 SELECT 语句的输出。
firstname evaluation firstname evaluation
Edward 100 Mary 50
Joe -1 Jim 0
常量表达式
返回一个固定值的确定表达式称为常量表达式。其中有以下的运算符(或系统常量),它们的返回值在运行时就已确定:
* CURRENT 从系统时钟返回当前的时间和日期:
* CURRENT_ROLE 返回角色名称(如果有的话),该角色的特权已对当前用户启用。
* CURRENT_ROLE 返回角色名称(如果有的话),该角色是当前用户的缺省角色。
* DBSERVERNAME 返回当前数据库服务器名。
* SITENAME 是 DBSERVERNAME 的同义词。
* TODAY 从系统时钟返回当前日历日期。
* USER 返回当前用户的登录名(也称为授权标识符)。
除了这些运算符之外,术语常量表达式还可指带引号字符串、文字值或带有操作数的 UNITS 运算符。
常量表达式具有下列语法。
阅读语法图跳过直观语法图常量表达式:
(1)
|--+-| Quoted String |------------------------------------------------+--|
| (2) |
+-| Literal Number |-----------------------------------------------+
+-+-USER---------------------------+-------------------------------+
| | (3) (4) | |
| '---------------+-CURRENT_ROLE-+-' |
| '-DEFAULT_ROLE-' |
| (4) |
'------+-+-SITENAME-----+----------------------------------------+-'
| '-DBSERVERNAME-' |
+-TODAY---------------------------------------------------+
+-CURRENT--+------------+---------------------------------+
| '- precision-' |
| (5) |
+-| Literal DATETIME |------------------------------------+
| (6) |
+-| Literal INTERVAL |------------------------------------+
+-num--UNITS--time_unit-----------------------------------+
| (3) |
'------+-+------------+--+- sequence-+-- .--+-CURRVAL-+-+-'
| '- owner-- .-' '- synonym--' '-NEXTVAL-' |
| (7) |
+-| Literal Collection |-------------------------+
| (8) |
+-| Literal Row |--------------------------------+
+-literal opaque type----------------------------+
'-literal BOOLEAN--------------------------------' |
|