2016-12-27 70 views
0

我正在编写一个简单的CASE来在员工获得更多的部门AVG工资时在屏幕上打印。但是我不明白为什么我在屏幕上看到只有一个结果,当我想检查2名员工的工资时。我希望你能理解我的问题。谢谢。关于PLSQL的CASE语句有什么问题?

SET SERVEROUTPUT ON 

DECLARE 
    v_emp121_sal employees.salary%TYPE; 
    v_emp121_lname employees.last_name%TYPE; 

    v_emp139_sal employees.salary%TYPE; 
    v_emp139_lname employees.last_name%TYPE; 

    v_avgsal  employees.salary%TYPE; 
BEGIN 
    SELECT salary, last_name 
    INTO v_emp121_sal, v_emp121_lname 
    FROM employees 
    WHERE employee_id = 121; 
    DBMS_OUTPUT.PUT_LINE('EMPLOYEE 121 SALARY IS: ' || v_emp121_sal); 

    SELECT salary, last_name 
    INTO v_emp139_sal, v_emp139_lname 
    FROM employees 
    WHERE employee_id = 139; 
    DBMS_OUTPUT.PUT_LINE('EMPLOYEE 139 SALARY IS: ' || v_emp139_sal); 

    SELECT AVG(salary) 
    INTO v_avgsal 
    FROM employees 
    WHERE department_id = 50; 
    DBMS_OUTPUT.PUT_LINE('DEPARTMENT 50 AVG SALARY IS: ' || 
          TRUNC(v_avgsal, 0)); 


    CASE 
     WHEN 
      v_emp121_sal < v_avgsal THEN 
      DBMS_OUTPUT.PUT_LINE('SALARY OF EMP ' || v_emp121_lname || 
           ' IS LESS THAN DEPARTMENT AVG'); 
     WHEN 
      v_emp121_sal > v_avgsal THEN 
      DBMS_OUTPUT.PUT_LINE('SALARY OF EMP ' || v_emp121_lname || 
           ' IS HIGHER THAN AVG DEPARTMENT'); 
     WHEN 
      v_emp139_sal < v_avgsal THEN 
      DBMS_OUTPUT.PUT_LINE('SALARY OF EMP ' || v_emp139_lname || 
           ' IS LESS THAN DEPARTMENT AVG'); 
     WHEN 
      v_emp139_sal > v_avgsal THEN 
      DBMS_OUTPUT.PUT_LINE('SALARY OF EMP ' || v_emp139_lname || 
           ' IS HIGHER THAN AVG DEPARTMENT'); 
    END CASE; 

END; 
/

enter image description here

理论,我应该接受在屏幕上 “EMP抚顺石油化工研究院的工资比AVG DEPARTMENT较高的” “EMP SEO的工资比AVG DEPARTMENT LESS”

+0

工资NUMBER(8,2) – Rattlesnake

+0

'响尾蛇'..你可以在这里发布你的工作代码供其他人参考 – XING

回答

3

一个case表达返回一个值。如果两名员工需要单独输出,请使用2 case表达式,以便每个表达式都返回自己的值。

CASE 
     WHEN 
      v_emp121_sal < v_avgsal THEN 
      DBMS_OUTPUT.PUT_LINE('SALARY OF EMP ' || v_emp121_lname || 
           ' IS LESS THAN DEPARTMENT AVG'); 
     WHEN 
      v_emp121_sal > v_avgsal THEN 
      DBMS_OUTPUT.PUT_LINE('SALARY OF EMP ' || v_emp121_lname || 
           ' IS HIGHER THAN AVG DEPARTMENT'); 
END CASE; 

CASE 
     WHEN 
      v_emp139_sal < v_avgsal THEN 
      DBMS_OUTPUT.PUT_LINE('SALARY OF EMP ' || v_emp139_lname || 
           ' IS LESS THAN DEPARTMENT AVG'); 

     WHEN 
      v_emp139_sal > v_avgsal THEN 
      DBMS_OUTPUT.PUT_LINE('SALARY OF EMP ' || v_emp139_lname || 
           ' IS HIGHER THAN AVG DEPARTMENT'); 
END CASE; 

你可能要添加一个条件=以及这样就可以避免一个null输出时><条件失败。

+1

@Rattlesnake - 为了进一步阐明为什么原始代码不产生OP想要的输出:'case评估表达式,直到第一个“when”条件为真。一旦'when'条件成立,'then'值被返回/动作被取消,并且整个'case'表达式被退出 - 不再进行进一步的评估或分配。 – mathguy

+0

我正在考虑这个问题,我试图用IF语句做同样的事情,但我收到了相同的结果(一个雇员条件)有没有办法检查同一CASE或IF句子中雇员的工资?感谢您的回复。 – Rattlesnake

+1

@响尾蛇 - 这是可能的。 '当v_emp_121_sal> avg THEN' <在同一时间执行两次PUT_LINE操作>,而不是单独的WHEN分支。 – mathguy