CREATE PROCEDURE update_salary
(IN employee_number CHAR(6), IN rating INT)
LANGUAGE SQL
BEGIN
DECLARE SQLSTATE CHAR(5);
DECLARE not_found CONDITION FOR SQLSTATE '02000';
DECLARE EXIT HANDLER FOR not_found
SIGNAL SQLSTATE '02444';
CASE rating
WHEN 1 THEN
UPDATE employee
SET salary = salary * 1.10, bonus = 1000
WHERE empno = employee_number;
WHEN 2 THEN
UPDATE employee
SET salary = salary * 1.05, bonus = 500
WHERE empno = employee_number;
ELSE
UPDATE employee
SET salary = salary * 1.03, bonus = 0
WHERE empno = employee_number;
END CASE;
END
select creator,
count(case type when 'T' then 1 else null end) as tables,
count(case type when 'V' then 1 else null end) as views
from sysibm.systables group by creator
是的哦有的
条件表达式
可在 SQL 语句中使用 CASE 表达式以便于处理表的数据表示。这提供了一种功能强大的条件表达式能力,在概念上与某些程序设计语言中的 CASE 语句类似。
· 要从 ORG 表中的 DEPTNAME 列将部门编号更改为有意义的词,输入下列查询:
· SELECT DEPTNAME,
· CASE DEPTNUMB
· WHEN 10 THEN 'Marketing'
· WHEN 15 THEN 'Research'
· WHEN 20 THEN 'Development'
· WHEN 38 THEN 'Accounting'
· ELSE 'Sales'
· END AS FUNCTION
· FROM ORG
结果为:
DEPTNAME FUNCTION
-------------- -----------
Head Office Marketing
New England Research
Mid Atlantic Development
South Atlantic Accounting
Great Lakes Sales
Plains Sales
Pacific Sales
Mountain Sales
· 可使用 CASE 表达式来防止出现异常情况,如被零除等。在下列示例中,如果雇员没有奖金或佣金报酬,则语句条件通过避免除法运算来防止出错:
·
· SELECT LASTNAME, WORKDEPT FROM EMPLOYEE
· WHERE(CASE
· WHEN BONUS+COMM=0 THEN NULL
· ELSE SALARY/(BONUS+COMM)
· END ) > 10
· 可在单个语句中使用 CASE 表达式,根据一个列中值的子集的总和与该列中所有值的总和的比来产生一个比率。使用 CASE 表达式的语句只需要传送数据一次。在没有 CASE 表达式的情况下,执行同样的计算至少需要传送两次。
下列示例使用 CASE 表达式计算部门 20 的薪水之和与全部薪水总额的比率:
SELECT CAST(CAST (SUM(CASE
WHEN DEPT = 20 THEN SALARY
ELSE 0
END) AS DECIMAL(7,2))/
SUM(SALARY) AS DECIMAL (3,2))
FROM STAFF
结果为 0.11。注意:CAST 函数确保结果的精度得到保持。
· 可使用 CASE 表达式来计算简单的函数,而不必调用函数本身,调用函数将需要额外开销。例如:
· CASE
· WHEN X<0 THEN -1
· WHEN X=0 THEN 0
· WHEN X>0 THEN 1
· END
此表达式与 SYSFUN 模式中 SIGN 用户定义函数有相同的结果。