Как использовать внутренний корпус в Oracle? - PullRequest
1 голос
/ 20 октября 2019

У меня есть сотрудник таблицы, у которого есть записи данных:

select * from offc.employee;

enter image description here

Некоторые люди покинули офис, поэтому у них есть leave_dateи некоторые люди все еще работают, чего у них нет leave_date. Итак, я только отфильтровал сотрудника, у которого нет leave_date в одном запросе, и сотрудника с параметром left_date в другом запросе, и объединил их, используя UNION. Итак, я пишу запрос:

SELECT emp_id, 
       emp_name, 
       dob, 
       dept_id, 
       join_date, 
       leave_date, 
       line1, 
       line2, 
       salary, 
       salary upgraded_salary 
FROM   offc.employee 
WHERE  leave_date IS NOT NULL 
UNION 
SELECT emp_id, 
       emp_name, 
       dob, 
       dept_id, 
       join_date, 
       leave_date, 
       line1, 
       line2, 
       salary, 
       CASE 
              WHEN sysdate-join_date>5 THEN salary*1.5 
              WHEN sysdate-join_date<3 THEN salary*1.25 
              WHEN sysdate-join_date<1 THEN salary*1.01 
              ELSE salary 
       END upgraded_salary 
FROM   offc.employee 
WHERE  leave_date IS NULL;SELECT emp_id, 
       emp_name, 
       dob, 
       dept_id, 
       join_date, 
       leave_date, 
       line1, 
       line2, 
       salary, 
       CASE 
              WHEN leave_date IS NOT NULL THEN 
                     CASE 
                            WHEN leave_date-join_date>5 THEN salary*1.5 
                            WHEN leave_date-join_date<3 THEN salary*1.25 
                            WHEN leave_date-join_date<1 THEN salary*1.01 
                            ELSE salary 
                     END upgraded_salary 
              ELSE salary 
       END 
FROM   offc.employee 
WHERE  leave_date IS NOT NULL;

Я получилправильный вывод, как я ожидал:

enter image description here Но я также пытался использовать его в одном запросе, где мне нужен внутренний регистр, я путаюсь с использованием вложенного регистра. Но я пыталсяиспользуя вложенный регистр, но он не работает. Итак, если я могу сделать это из оператора вложенного регистра, мой запрос может быть оптимизирован. Итак, я попытался:

SELECT emp_id, 
       emp_name, 
       dob, 
       dept_id, 
       join_date, 
       leave_date, 
       line1, 
       line2, 
       salary, 
       CASE 
              WHEN leave_date IS NOT NULL THEN 
                     CASE 
                            WHEN leave_date-join_date>5 THEN salary*1.5 
                            WHEN leave_date-join_date<3 THEN salary*1.25 
                            WHEN leave_date-join_date<1 THEN salary*1.01 
                            ELSE salary 
                     END upgraded_salary 
              ELSE NULL 
       END 
FROM   offc.employee 
WHERE  leave_date IS NOT NULL;

Я получил ошибку: ORA-00905: missing keyword

Поскольку мне нужен тот же вывод, возможно ли получить использование вложенного оператора case?

Ответы [ 2 ]

3 голосов
/ 20 октября 2019

Не помещайте слово «upgradeded_salary» после внутреннего регистра, ставьте его после внешнего

В вашем выражении внешнего регистра также нет особого смысла, потому что ваше предложение where фильтрует только то, где указана дата выходане равно нулю, поэтому внешний CASE WHEN всегда будет истинным, ELSE никогда не будет истинным

enter image description here

2 голосов
/ 20 октября 2019

Существует проблема с псевдонимами

SELECT emp_id, 
       emp_name, 
       dob, 
       dept_id, 
       join_date, 
       leave_date, 
       line1, 
       line2, 
       salary, 
       CASE WHEN leave_date IS NOT NULL 
       THEN 
          CASE WHEN leave_date-join_date > 5 THEN salary*1.5 
               WHEN leave_date-join_date < 3 THEN salary*1.25 
               WHEN leave_date-join_date < 1 THEN salary*1.01 
               ELSE salary 
          END -- upgraded_salary -- issue in your query, 
              -- name of alias should be after last END
       END upgraded_salary -- alias name shoild be here
FROM   offc.employee ;
--WHERE  leave_date IS NOT NULL; -- WHERE Condition not needed

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...