Chinaunix首页 | 论坛 | 博客
  • 博客访问: 970420
  • 博文数量: 358
  • 博客积分: 8185
  • 博客等级: 中将
  • 技术积分: 3751
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:27
个人简介

The views and opinions expressed all for my own,only for study and test, not reflect the views of Any Company and its affiliates.

文章分类

全部博文(358)

文章存档

2012年(8)

2011年(18)

2010年(50)

2009年(218)

2008年(64)

我的朋友

分类: Oracle

2009-07-19 17:31:37

转自CNOUG上oraclewindows的9i 007 个人总结,稍作修改

■■■■■■Functions
・单行函数 这些函数仅对单个行进行运算,并且每行返回一个结果。
:操纵数据项
:接受多个参数并返回一个值
:作用于每一个返回行
:每行返回一个结果
:可以修改数据类型
:可以嵌套
:接受多个参数,参数可以是一个列或者一个表达式
单行函数的特性包括:
:: 作用于查询中返回的每一行
:: 每行返回一个结果
:: 可能返回一个与参数不同类型的数据值
:: 可能需要一个或多个参数
:: 能够用在SELECT、WHERE和ORDER BY子句中;可以嵌套

・多行函数
这些函数能够操纵成组的行,每个行组给出一个结果,这些函数也被称为组函数。

■■单行函数
::字符函数:接受字符输入,可以返回字符或者数字值(lower ,upper,initcap,concat,substr,length,instr,lpad|rpad ,trim,replace)
::数字函数:接受数字输入,返回数字值
::日期函数:对DATE数据类型的值进行运算 (除了MONTHS_BETWEEN函数返回一个数字,所有日期函数都返回一个DATE数据类型的值。)
:: 转换函数:从一个数据类型到另一个数据类型转换一个值
:: 通用函数:( NVL,NVL2,NULLIF,COALSECE,CASE,DECODE)

■字符函数
LOWER(column|expression)转换字符值为小写
UPPER(column|expression)转换字符值为小写
INITCAP(column|expression)转换每个单词的首字母值为大写,所有其它值为小写
CONCAT(column1|expression1,column2|expression2)连接第一个字符值到第二个字符值;等价于连接运算符 (||)
SUBSTR(column|expression,m[,n])从字符返值中回指定的字符,开始位置在 m,n字符长度 (如果 m 是负数,计数从字符值末尾开始;如果 n 被忽略,返回到串结束的所有字符)。
LENGTH(column|expression)返回表达式中的字符数
INSTR(column|expression,‘string’, [,m], [n] )返回一个命名串的数字位置。随意地,你可以提供一个位置m作为查找的开始,在字符串中第n次发现的位置。m和n的默认值是1,意味着在起始开始查找,并且报告第一个发现的位置。
LPAD(column|expression, n,'string')
RPAD(column|expression, n,'string')填充字符值左、右调节到n字符位置的总宽度
TRIM(leading|trailing|both, trim_character FROM trim_source)使你能够从一个字符串修整头或尾字符(或两者)。如果trim_character或trim_source是字符文字,你必须放在单引号中。
REPLACE(text, search_string, replacement_string)从字符串查找一个文本表达式,如果找到,用指定的置换串代替它
eg:
CONCAT('Hello', World') HelloWorld
SUBSTR('HelloWorld',1,5) Hello
LENGTH('HelloWorld') 10
INSTR('HelloWorld', 'W') 6(找到一个给定字符的数字位置)
LPAD(salary, 10,'*') *****24000(用给定的字符左填充字符串到给定的长度)
RPAD(salary, 10, '*') 24000*****(用给定的字符右填充字符串到给定的长度)
TRIM('H' FROM 'HelloWorld') elloWorld 从一个字符串中去除头或尾字符(或两者)

■数字函数
ROUND(column|expression, n) 函数
ROUND函数四舍五入列、表达式或者n位小数的值。如果第二个参数是0或者缺少,值被四舍五入为整数。如果第二个参数是2,值被四舍五入为两位小数。如果第二个参数是–2,值被四舍五入到小数点左边两位。 ROUND函数也能够被用于日期函数
TRUNC(column|expression,n)函数
TRUNC函数截断列、表达式或者n位小数值。TRUNC函数对参数起的作用类似于ROUND函数。如果第二个参数是0或者缺少,值被截断为整数。如果第二个参数是2,值被截断为两位小数。如果第二个参数是–2,值被截断到小数点左边两位象ROUND函数,TRUNC函数也可以被用于日期函数。
MOD(m,n)函数
返回m除以n的余数、经常用于确定一个值是奇数还是偶数。
eg:
::ROUND:四舍五入指定小数的值 ROUND(45.926, 2)  45.93
ROUND(45.923,-1)  50 ROUND(45.923,0)   46
::TRUNC: 截断指定小数的值 TRUNC(45.926, 2)  45.92
TRUNC(45.923)  45 TRUNC(45.923,-2)  0
::MOD: 返回除法的余数 MOD(1600, 300)    100

■日期的使用
Oracle 数据库用内部数字格式存储日期:世纪,年,月,日,小时,分钟和秒
::默认日期显示格式是DD-MON-RR.
–仅指定年的最后两位数字,允许你存储21世纪日期在20世纪中
–用同样的方式,允许你存储20世纪的日期在21世纪中
::存储在数据库所有的日期和时间的组成部分都会被存储CENTURY YEAR MONTH DAY HOUR MINUTE SECOND
::DATE数据类型总是以4位内部数字存储年信息:
两位数字代表世纪,两位数字代表年。例如,Oracle数据库存储年为1996或2001,而不是仅仅存96或01。

・日期计算
::从日期加或者减一个数,结果是一个日期值
::两个日期相减,得到两个日期之间的天数
::用小时数除以24,可以加小时到日期上
运算 结果 说明
date + number 日期 加一个天数到一个日期上
date - number 日期 从一个日期上减一个天数
date - date 天数 用一个日期减另一个日期
date + number/24 日期 加一个小时数到一个日期上

・SYSDATE函数
SYSDATE是一个日期函数,它返回当前数据库服务器的日期和时间
eg:
显示所有在部门90中的雇员的名字和从业的周数。雇员的总工作时间以周计算,用当前日期 (SYSDATE) 减去雇员的受顾日期,再除以7。
SELECT last_name,(SYSDATE-hire_date)/7 AS WEEKS
FROM employees
WHERE department_ID=90;
如果被减数大于当前日期,差是负数。

・日期函数
函数 说明 返回值类型
MONTHS_BETWEEN 两个日期之间的月数  数字值(月份的差值)
ADD_MONTHS 加日历月到日期  DATE
NEXT_DAY 下个星期几是几号  DATE
LAST_DAY 指定月的最后一天  DATE
ROUND 四舍五入日期  DATE
TRUNC 截断日期  DATE

日期函数对Oracle日期进行操作,除了MONTHS_BETWEEN返回一个数字值,所有日期函数都返回一个DATE数据类型。
:: MONTHS_BETWEEN(date1, date2):计算date1和date2之间的月数,其结果可以是正的,也可以是负的。如果date1大于date2,结果是正的,反之,结果是负的。结果的小数部分表示月的一部分。
:: ADD_MONTHS(date, n):添加n个日历月到date。n的值必须是整数,但可以是负的。
:: NEXT_DAY(date, ‘char’):计算在date之后的下一个周(‘char’)的指定天的日期。char的值可能是一个表示一天的数或者是一个字符串。
:: LAST_DAY(date):计算包含date的月的最后一天的日期。
:: ROUND(date [,‘fmt’]):返回用格式化模式fmt四舍五入到指定单位的 date ,如果格式模式 fmt 被忽略,date被四舍五入到最近的天。
:: TRUNC(date [, ‘fmt’]):返回用格式化模式fmt截断到指定单位的带天的时间部分的date,如果格式模式fmt被忽略,date被截断到最近的天。
eg:
①使用日期函数
MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') 19.6774194
ADD_MONTHS ('11-JAN-94',6) '11-JUL-94'
NEXT_DAY ('01-SEP-95','FRIDAY') 下个星期五是几号'08-SEP-95'
LAST_DAY('01-FEB-95') '28-FEB-95'
②使用日期函数
假定SYSDATE = '25-JUL-95':
ROUND(SYSDATE,'MONTH') 01-AUG-95 ROUND(SYSDATE ,'YEAR') 01-JAN-96
TRUNC(SYSDATE,'MONTH') 01-JUL-95 TRUNC(SYSDATE ,'YEAR') 01-JAN-95
TRUNC(TO_DATE('25-JUL-95') ,'YEAR') 01-JAN-95
③更多例子:
注意:nls_date_language
select TRUNC(TO_DATE(‘25-JUL-95’),‘YEAR’) from dual
第 1 行出现错误:
ORA-01843: 无效的月份
出现错误的原因是语言和区域设置 NLS_LANG 不匹配,用下面的命令测试一下:
select to_char(SYSDATE) from dual
结果是:18-4月 -05
我们再试下面的语句:
select TRUNC(TO_DATE(‘25-7月-95’), ‘YEAR’) from dual
alter session set nls_date_language='AMERICAN';

■■oracle日期时间函数

:: 在 Oracle9i 中,你能够在你的日期和时间数据中包含时区,并且提供对小数秒的支持
:: 新的日期时间数据类型:
-TIMESTAMP
-TIMESTAMP WITH TIME ZONE (TSTZ) 
-TIMESTAMP WITH LOCAL TIME ZONE (TSLTZ) 
:: Oracle9i 服务器提供对日期时间数据类型的夏令时支持

■CURRENT_DATE
:: 显示在会话时区中的当前日期和时间
:: CURRENT_DATE 对于会话时区是敏感的
ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';
Note:the ALTER SESSION command sets the date format of the session to 'DD-MON-YYYY HH24:MI:SS' that is Day of month(1-31)-Abbreviated name of month -4-digityear Hours of dat(0-23):Minute(0-59):Second(0-59)

■CURRENT_TIMESTAMP
:: 显示在会话时区中的当前日期和时间,包含小数秒
::CURRENT_TIMESTAMP 对于会话时区是敏感的
::返回值是TIMESTAMP WITH TIME ZONE 数据类型
ALTER SESSION SET TIME_ZONE='-5:0';   //'-8.0'
SELECT SESSIONTIMEZONE,CURRENT_TIMESTAMP FROM DUAL;

■LOCALTIMESTAMP
:: 以 TIMESTAMP 数据类型的值显示在会话时区中的当前日期和时间
ALTER SESSION SET TIME_ZONE = '-5:0';
SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP 
FROM DUAL;

:: LOCALTIMESTAMP 返回一个 TIMESTAMP 值,而 CURRENT_TIMESTAMP 返回一个 TIMESTAMP WITH TIME ZONE 值

■DBTIMEZONE 和 SESSIONTIMEZONE
:: 显示数据库时区的值   
SELECT DBTIMEZONE FROM DUAL;
:: 显示会话时区的值
SELECT SESSIONTIMEZONE FROM DUAL;

■EXTRACT
语法:  
SELECT  EXTRACT ([YEAR] [MONTH][DAY] [HOUR] [MINUTE][SECOND][TIMEZONE_HOUR] [TIMEZONE_MINUTE]
[TIMEZONE_REGION] [TIMEZONE_ABBR]
FROM [datetime_value_expression] 
[interval_value_expression]);
TIMESTAMP WITH LOCAL TIME ZONE 存储在数据库时区中,当一个用户选择数据时,值被调整到用户会话的时区。
eg:
:: 从SYSDATE 中显示年
   SELECT EXTRACT (YEAR FROM SYSDATE) FROM DUAL;
:: 从 HIRE_DATE 中显示 MANAGER_ID 是100的雇员的月
SELECT last_name, hire_date, 
       EXTRACT (MONTH FROM HIRE_DATE)
FROM employees
WHERE manager_id = 100;
LAST_NAME                 HIRE_DATE  EXTRACT(MONTHFROMHIRE_DATE)
------------------------- ---------- ---------------------------
Kochhar                   21-9月 -89                           9
De Haan                   13-1月 -93                           1
Raphaely                  07-12月-94                          12
Weiss                     18-7月 -96                           7
Fripp                     10-4月 -97                           4
Kaufling                  01-5月 -95                           5

■转换函数
 到
VARCHAR2 or CHAR NUMBER
VARCHAR2 or CHAR DATE
NUMBER VARCHAR2
DATE VARCHAR2
注:只有当字符串表示一个有效的数时,CHAR到NUMBER转换才能成功。
隐式数据转换不只是在前面提到的数据类型之间进行,还有其他一些隐式数据转换可以进行,例如,VARCHAR2可以被隐式转换为ROWID。

SQL 提供三种函数来从一种数据类型转换值到另一种:

TO_CHAR(number|date,[ fmt],[nlsparams])
指定返回的月和日名字及其缩写的语言。如果忽略该参数,该函数在会话中使用默认日期语言
  nlsparams 参数指定下面的字符,它由数字格式化元素返回:(小数字符,分组符,本地货币符号,国际货币符号)如果忽略nlsparams或其它参数,该函数在会话中使用默认参数值
TO_NUMBER(char,[fmt],[nlsparams])
用由可选格式化样式fmt指定的格式转换包含数字的字符串为一个数字。Nlsparams参数在该函数中的目的与TO_CHAR函数用于数字转换的目的相同
TO_DATE(char,[fmt],[nlsparams])
按照fmt指定的格式转换表示日期的字符串为日期值。如果忽略fmt,格式是 DD-MON-YY。Nlsparams参数的目的与TO_CHAR函数用于日期转换时的目的相同

・对日期使用TO_CHAR函数
TO_CHAR(date,'format_model')
格式模板::必须加单引号,并且区分大小写
::能够包含任一有效的日期格式元素
::有一个fm元素用来删除填补的空,或者前导零
::用一个逗号与日期值分开
日期格式模板的元素
YYYY 数字全写年 
YEAR 年的拼写 
MM 月的两数字值
MONTH 月的全名
DY 周中天的三字母缩写
DAY 周中天的全名
MON 月的三字母缩写
DD 月的数字天

eg:
SELECT employee_id, TO_CHAR(hire_date, 'MM/YY') Month_Hired
FROM employees
WHERE last_name = 'Higgins';
EMPLOYEE_ID MONTH
205 06/94
select TO_CHAR(SYSDATE,'HH24:MI:SS AM') from dual 15:45:32 PM
select TO_CHAR(TO_DATE('21-1月-95'),'YYYY-MM-DD HH24:MI:SS AM') from dual
select TO_CHAR(SYSDATE,'DD "of" MONTH') from dual 12 of OCTOBER
select TO_CHAR(TO_DATE('25-JUL-95'),'DD "of" MONTH') from dual
select TO_CHAR(TO_DATE('25-7月-95'),'DD "of" MONTH') from dual
select to_char(sysdate, 'ddspth') from dual
select TRUNC(TO_DATE(‘25-JUL-95’) ,‘ddspth’) from dual -- NLS_LANG 是英文设置
SQL> select TRUNC(TO_DATE('25-JUL-95') ,'ddspth') from dual;
TRUNC(TO_DAT
------------
25-JUL-95
select TRUNC(TO_DATE(‘25-7月-95’) ,‘ddspth’) from dual -- NLS_LANG 是中文设置
select to_char(sysdate,'ddspth') from dual --fourtheenth

※使用在下表中列出的格式,显示时间信息和文字,并且改变数字为拼写的数字。

元素 说明
AM或PM 正午指示
A.M.或P.M. 带句点的正午指示
HH或HH12或HH24 天的小时,或小时(1–12),或小时(0–23)
MI 分钟 (0–59)
SS 秒 (0–59)
SSSSS 午夜之后的秒 (0–86399)

其它格式
元素 说明
/ . , 在结果中使用标点符号
“of the” 在结果中使用引文串
指定后缀来影响数字显示
元素 说明
TH 序数 (例如,DDTH显示为4TH)
SP 拼写出数字 (例如,DDSP显示为FOUR)
SPTH or THSP 拼写出序数 (例如,DDSPTH显示为FOURTH))

SQL> edit;
已写入 file afiedt.buf
  1  select to_char(hiredate,'fmDd Month YYYY') AS HIREDATE
  2* from emp
SQL> /

HIREDATE
--------------
17 12月 1980
20 2月 1981
SQL> edit;
已写入 file afiedt.buf
  1  select ename,TO_CHAR(hiredate,'fmDdspth "of" Month YYYY fmHH:MI:SS AM')AS HIREDATE
  2* from emp
SQL> /
ENAME      HIREDATE
---------- -------------------------------------------
SMITH      Seventeenth of 12月 1980 12:00:00 上午
ALLEN      Twentieth of 2月 1981 12:00:00 上午
WARD       Twenty-Second of 2月 1981 12:00:00 上午
JONES      Second of 4月 1981 12:00:00 上午
MARTIN     Twenty-Eighth of 9月 1981 12:00:00 上午

注意,月以指定的格式模式显示:换句话说,第一个字母是大写其余字母是小写。

对数字使用TO_CHAR函数
TO_CHAR(number,'format_model','nlsparameter')
下面是一些你能够和TO_CHAR一起使用的格式化元素,用于显示字符形式的数字值:
9 表示一个数
0 强制显示为零
$ 放置一个浮动美元符号
L 使用浮动本地货币符号
. 打印一个小数点
, 打印一个千位指示
eg:
如果你正在转换一个数字到字符数据类型,你可以用下面的格式元素:
元素 说明 举例 结果
9 数字位置 (9的个数决定显示宽度) 999999 1234
0 显示前导0 099999 001234
$ 浮动美圆符号 $999999 $1234
L 浮动本地货币符号 L999999 FF1234
. 小数点位置指定 999999.99 1234.00
, 逗号位置指定 999,999 1,234
MI 右边减号 (负值) 999999MI 1234-
PR 将负数加上括号 999999PR <1234>
EEEE 科学计数法 (格式化必须指定四个E)99.999EEEE 1.234E+03
V 乘10,n次 (n = V 后面 9 的个数) 9999V99 123400
B 将0显示为空格 B9999.99 1234.00

转换字符串到数字,用to_number函数格式化:
to_number(char[,'format_model','nls'])

・转换字符串到日期,用to_date函数格式化:
to_date(char,['format_model','nls'])

这些函数有一个fx修饰符,该修饰符指示对字符参数和一个TO_DATE函数模板的数据格式的精确匹配
Fx 修饰符指定 TO_DATE 函数对于字符参数和日期格式化样式的额外匹配:
:: 在字符参数中,标点符号和引号中的文本必须完全匹配格式化样式中相应的部分。
:: 字符参数不能有额外的空格。如果无fx,Oracle 服务器将忽略额外的空格。
:: 在字符参数中数字数据必须与格式化样式中的元素有相应的数字个数。如果无 fx,在字符参数中的可以忽略前导 0。
eg:
显示所有在May 24, 1999 参加工作的雇员的名字和受雇日期。因为使用了 fx 修饰符,需要精确的匹配,并且在单词 ‘May’ 之后的空格不认可。
SELECT last_name, hire_date
FROM employees
WHERE hire_date = TO_DATE('May 24, 1999', 'fxMonth DD, YYYY');

※区分年和世纪 (RR、YY)


■通用函数
这些函数可用于任意数据类型,并且适用于空值
:: NVL (expr1, expr2)
:: NVL2 (expr1, expr2, expr3)
:: NULLIF (expr1, expr2)
:: COALESCE (expr1, expr2, ..., exprn)
函数 说明
NVL 转换空值为一个实际值
NVL2 如果expr1非空,NVL2返回expr2;如果expr1为空,NVL2返回expr3。参数 expr1可以是任意数据类型。
NULLIF 比较两个表达式,如果相等返回空;如果不相等,返回第一个表达式
COALESCE 返回表达式列表中的第一个非空表达式

・NVL函数
转换一个空值到一个实际的值
:: 可用的数据类型可以是日期、字符和数字
:: 数据类型必须匹配:
–NVL(commission_pct,0)
–NVL(hire_date,'01-JAN-97')
–NVL(job_id,'No Job Yet')
语法: NVL(expr1, expr2)
在语法中:
expr1 是包含空值的源值或者表达式
expr2 是用于转换空值的目的值
你可以使用 NVL 函数来转换任何数据类型,但返回值通常总是与 expr1 的数据类型相同。

NVL 用于转换各种数据类型
数据类型 转换例子
NUMBER NVL(number_column,9)
DATE NVL(date_column, '01-JAN-95')
CHAR or VARCHAR2 NVL(character_column, 'Unavailable')
eg:
正确的
SELECT last_name, salary, commission_pct,(salary*12) + (salary*12*nvl(commission_pct,0)) AN_SAL
错误的
SELECT last_name, salary, commission_pct,(salary*12) + (salary*12*commission_pct) AN_SAL

・NVL2 函数
NVL2 函数检查第一个表达式,如果第一个表达式不为空,那么 NVL2 函数返回第二个表达式;如果第一个表达式为空,那么第三个表达式被返回。
语法
NVL(expr1, expr2, expr3)
在语法中:
expr1 是可能包含空的源值或表达式
expr2 expr1 非空时的返回值
expr3 expr1 为空时的返回值
参数 expr1 可以是任何数据类型,参数 expr2 和 expr3 可以是除 LONG 之外的任何数据类型。如果 expr2 和 expr3 的数据类型不同,Oracle 服务器在比较它们之前将转换 

expr3 为 expr2 的数据类型,除非 expr3 是一个 null 常数,在这种情况下,不需要数据类型转换。
返回值的数据类型总是与 expr2 的数据类型相同,除非 expr2 是字符数据,在这种情况下,返回值的数据类型是 VARCHAR2。
eg:
select last_name,salary,commission_pct,NVL2(commission_pct,'SAL+COMM','SAL') income
from employees 
where department_id IN(50,80);
LAST_NAME SALARY COMMISSION_PCT INCOME
Zlokey 23244    .2 SAL+COMM
Abel 23423 SAL

・NULLIF 函数
NULLIF 函数比较两个表达式,如果相等,函数返回空,如果不相等,函数返回第一个表达式。第一个表达式不能为 NULL。
语法
NULLIF (expr1, expr2)
在语法中:
expr1 是对于 expr2 的被比较原值
expr2 是对于 expr1 的被比较原值。(如果它不等于 expr1,expr1 被返回)。

注:NULLIF 函数在逻辑上等同于下面的 CASE 表达式。CASE 表达式将在后面讨论:
CASE WHEN expr1 = expr 2 THEN NULL ELSE expr1 END
eg:
select first_name,length(first_name) "expr1",
last_name,length(last_name) "expr2",
nullif(length(first_name),length(last_name)) result
from employees;

FIRST_NAME expr1 LAST_NAME expr2 RESULT
Steven 6 King 4 6
neena 5 Kochhar 7 5
Bruce 5 Ernst 5
Trenna 6 Mourgos 7 6

・使用COALESCE 函数
COALESCE 函数返回列表中的第一个非空表达式../././././
语法
COALESCE (expr1, expr2, ... exprn)
在语法中:
expr1 如果它非空,返回该表达式
expr2 如果第一个表达式为空并且该表达式非空,返回该表达式
exprn 如果前面的表达式都为空,返回该表达式
eg:
select last_name,coalesce(commission_pct,salary,10) comm
from employees
order by commission_pct

LAST_NAME COMM
Grant  15
Zlokey  .2
Taylor  .2
King 24000
在例子中显示,如果 COMMISSION_PCT 值是非空,显示它。如果 COMMISSION_PCT 值是空,则显示 SALARY 。如果 COMMISSION_PCT 和 SALARY 值都是空,那么显示10。

■条件表达式
:: 在SQL 语句中提供IF-THEN-ELSE 逻辑的使用
:: 两种用法:
–CASE表达式
–DECODE函数
注:CASE 表达式是 Oracle9i 服务器新发布的。CASE 表达式与 ANSI SQL 兼容;DECODE 是特殊的 Oracle 语法。
・CASE表达式
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2  
 WHEN comparison_exprn THEN return_exprn 
 ELSE else_expr]
END
所有的表达式 ( expr、comparison_expr 和 return_expr) 必须是相同的数据类型,可以是 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2
eg:
SELECT last_name, job_id, salary,
CASE job_id WHEN 'IT_PROG' THEN 1.10*salary 
 WHEN 'ST_CLERK' THEN 1.15*salary
 WHEN 'SA_REP' THEN 1.20*salary
ELSE salary END "REVISED_SALARY"
FROM employees;
LAST_NAME JOB_ID SALARY REVISED_SALARY
Lorentz IT_PROD 4200 4620
Mourgos ST_MAN 5800 5800
Rajs ST_CLERK 3500 4025
如果 JOB_ID 是 IT_PROG,薪水增加 10%;如果 JOB_ID 是 ST_CLERK,薪水增加 15%;如果 JOB_ID 是 SA_REP,薪水增加 20%。对于所有其他的工作角色,不增加薪水。

・DECODE函数
DECODE(col|expression, search1, result1 [, search2, result2,...,][, default])
DECODE 函数在比较表达式 (expression) 和每个查找 (search) 值后解码表达式,如果表达式与查找相同,返回结果。如果省略默认值,当没有查找值与表达式相匹配时返回一个

空值。
eg:
SELECT last_name, job_id, salary,
DECODE(job_id, 'IT_PROG', 1.10*salary,
'ST_CLERK',1.15*salary,
'SA_REP', 1.20*salary,
 salary) //default
REVISED_SALARY
FROM employees;

LAST_NAME JOB_ID SALARY REVISED_SALARY
Lorentz IT_PROD 4200 4620
Mourgos ST_MAN 5800 5800
Rajs ST_CLERK 3500 4025
等同于
IF job_id = 'IT_PROG' THEN salary = salary*1.10
IF job_id = 'ST_CLERK' THEN salary = salary*1.15
IF job_id = 'SA_REP' THEN salary = salary*1.20
ELSE salary = salary

SELECT last_name, salary,
DECODE (TRUNC(salary/2000, 0),
0, 0.00,
1, 0.09,
2, 0.20,
3, 0.30,
4, 0.40,
5, 0.42,
6, 0.44,
  0.45) TAX_RATE
FROM employees
WHERE department_id = 80;





阅读(1267) | 评论(0) | 转发(0) |
0

上一篇:Questions Tips

下一篇:Note2_表连接

给主人留下些什么吧!~~