2016-12-27 9 views
0

私は、社員が部門のAVG給与をより多く稼ぐと、画面に印刷する簡単なケースをコーディングしています。しかし、私は2人の従業員の給与を確認したいときに1つの結果しか表示されない理由を理解できません。あなたが私の質問を理解することを願っていますありがとう。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 FRIPPの給与はAVG DEPARTMENTより高い"

+0

salary NUMBER(8,2) – Rattlesnake

+0

'rattlesnake' ..ここにあなたの作業コードを投稿することができます。参照先 – XING

答えて

3

case表現 "EMP SEO給与はAVG DEPARTMENTに満ちません" 1つの値を返します。 2人の従業員に別々の出力が必要な場合は、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が望む出力を生成しない理由をさらに明確にする: '式は最初の' when'条件が真になるまで評価されます。 'when'条件がtrueになると、' then'値が返され/ actionが実行され、 'case'式全体が終了します。それ以上の評価や代入は行われません。 – mathguy

+0

私はそれについて考えていましたが、IF文で同じことをしようとしましたが、同じ結果を受けました(従業員1人の条件)同じCASE文またはIF文内の従業員の給与を確認する方法はありますか?返信ありがとう。 – Rattlesnake

+1

@ラットスネーク - 可能です。 'WHEN v_emp_121_sal> avg THEN' <別々のWHENブランチではなく、同じ時間にPUT_LINEアクションを両方実行します。 – mathguy

関連する問題