ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PL/SQL编程之道之CASE使用(2)

PL/SQL编程之道之CASE使用(2)

原创 Linux操作系统 作者:道行尚浅 时间:2010-10-08 16:49:50 0 删除 编辑
1 同样是一个公司的人,待遇差距咋就那么大呢?
公司年度总结出来了。部门10盈利增长100%。部门20也增长了。负增长50%。
经过公司党委,工会,董事会啥的研究决定:
给部门10的员工每人涨工资1000元的工资。
给部门20的员工每人涨负200刀元工资。
?
现在要求先出个报表看一下调整之后的工资情况。
?
情况就是这么个情况。事情就是这么个事情。

我们先来看一下数据。
EMPNO    ENAME    SAL    DEPTNO
7369    SMITH    800.00    20
7499    ALLEN    1600.00    30
7521    WARD    1250.00    30
7566    JONES    2975.00    20
7654    MARTIN    1250.00    30
7698    BLAKE    2850.00    30
7782    CLARK    2450.00    10
7788    SCOTT    3000.00    20
7839    KING    5000.00    10
7844    TURNER    1500.00    30
7876    ADAMS    1100.00    20
7900    JAMES    950.00    30
7902    FORD    3000.00    20
7934    MILLER    1300.00    10

最基本的思路
1 找出部门10的员工姓名 工资 部门编号 然后将其工资+1000
2 找出部门20的员工姓名 工资部门编号  然后将其工资-500
3 两个结果集相连 一切就OK了。

1 找出部门10的员工姓名 工资 部门编号 然后将其工资+1000
SELECT EMPNO, ENAME, SAL + 1000, DEPTNO   FROM EMP WHERE DEPTNO = 10
EMPNO    ENAME    SAL+1000    DEPTNO
7782    CLARK    3450    10
7839    KING    6000    10
7934    MILLER    2300    10

2 找出部门20的员工姓名 工资部门编号  然后将其工资-500
SELECT EMPNO, ENAME, SAL -500, DEPTNO   FROM EMP WHERE DEPTNO = 20
EMPNO    ENAME    SAL-500    DEPTNO
7369    SMITH    300        20
7566    JONES    2475    20
7788    SCOTT    2500    20
7876    ADAMS    600      20
7902    FORD    2500    20

连接起来 为了便于观察我们按照部门编号排序

SELECT EMPNO, ENAME, SAL - 500, DEPTNO
  FROM EMP
 WHERE DEPTNO = 20
Union All
SELECT EMPNO, ENAME, SAL + 1000, DEPTNO
  FROM EMP
 WHERE DEPTNO = 10
 Order By deptno

EMPNO    ENAME    SAL-500    DEPTNO
7839            KING         6000            10
7782            CLARK     3450            10
7934         MILLER     2300            10
7902             FORD         2500             20
7788             SCOTT    2500                20
7566            JONES        2475                20
7369            SMITH        300                20
7876           ADAMS      600                20

很好很和谐。结果正确。


但是请注意 我们访问了两次EMP表。
如果用CASE呢?这个查询完全可以合并到一个查询当中去。
使用CASE 完成查询所需要考虑的事情
1 是否访问相同的表。如果访问的表不同就不用考虑了
2 是否使用相同的列。 如果是基本肯定可以合并了
  如果不同的条件有组合 就需要注意业务逻辑。
3 如果使用的列不同。那么不同UNION 查询的条件是否有交集。 
  如果没有 基本上也可以合并。不过需要注意合并后的性能问题。

根据上面的注意事项我们来审视一下上面的例子
1 是否访问相同的表?
是
2 是否使用相同的列
也是,且没有交集。
那么开始我们的合并。

1 先找到10 20部门的员工
SELECT EMPNO, ENAME, SAL , DEPTNO   FROM EMP  WHERE DEPTNO In (10,20)
EMPNO      ENAME       SAL       DEPTNO
7369               SMITH       800.00    20
7566              JONES       2975.00    20
7782              CLARK      2450.00    10
7788             SCOTT      3000.00    20
7839              KING          5000.00         10
7876              ADAMS    1100.00      20
7902          FORD          3000.00         20
7934              MILLER    1300.00         10


然后根据部门的不同调整工资。
SELECT EMPNO,
       ENAME,
       SAL + (CASE
         WHEN DEPTNO = 10 THEN
          1000
         WHEN DEPTNO = 20 THEN
          -500
       END) SAL,
       DEPTNO
  FROM EMP
 WHERE DEPTNO IN (10, 20)

EMPNO    ENAME    SAL    DEPTNO
7934    MILLER    2300    10
7782    CLARK    3450    10
7839    KING    6000    10
7902    FORD    2500    20
7876    ADAMS    600        20
7566    JONES    2475    20
7369    SMITH    300        20
7788    SCOTT    2500    20


也达到相同的目的。但是这次我们使用了CASE 只访问了一次表




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24558043/viewspace-675550/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-09-14

  • 博文量
    33
  • 访问量
    37746