Как оптимизировать оператор case в запросе select, который имеет одинаковое условие проверки для трех разных столбцов

У меня ниже оператор выбора для извлечения данных с оператором CASE.

SELECT  PK_ID
,MGR_ID
,EMP_ID 
,CASE
    WHEN msts.MGR_ID is null AND msts.EMP_ID is not null THEN
        (SELECT 'A' from dual)  
    ELSE
        (SELECT 'B' from dual)  
END FIRST_COL
,CASE
    WHEN msts.MGR_ID is null AND msts.EMP_ID is not null THEN
        (SELECT 'P' from dual)   
    ELSE
        (SELECT 'Q' from dual)
END SECOND_COL
,CASE
    WHEN msts.MGR_ID is null AND msts.EMP_ID is not null THEN
        (SELECT 'X' from dual)
    ELIE
        (SELECT 'Y' from dual)
END THIRID_COL
 from m_sel_tabs msts

здесь, как я знаю, мы можем проверить условие с помощью нескольких столбцов, но результат будет только один для оператора CASE.

поэтому мой вопрос заключается в том, что, поскольку мой оператор проверки CASE одинаков для всех трех столбцов (FIRST_COL, SECOND_COL, THIRID_COL), следовательно, есть ли другой способ написать этот запрос оптимизированным способом.

Заранее спасибо.

Что вы здесь подразумеваете под «оптимизированным» - просто меньше повторений? (А почему вы выбираете строковые литералы из dual?)

Alex Poole 13.09.2018 20:10

Да просто поменьше повторений. (в этом экзамене я выбрал) А почему вы выбираете строковые литералы из двойных? -> Я, например, использовал строковые литералы из dual.

Piyush 13.09.2018 20:43
0
2
26
1

Ответы 1

Возможно, я ошибаюсь, но - когда я говорю, что у вас есть «те же 3 оператора CASE» - ну, это не так. Это 3 оператора CASE другой. Выражение то же самое, да, но вы выбираете 3 разных столбца с разными результатами (A, B, P, Q, X, Y - в вашем примере).

Вы можете создать функцию, которая будет «скрывать» код, который вы используете в настоящее время, и сделать SELECT красивее, например

select 
  pk_id, ...,
  f_col(1, MGR_ID, EMP_ID) first_col,
  f_col(2, MGR_ID, EMP_ID) second_col,
  f_col(3, MGR_ID, EMP_ID) third_col
from m_sel_tabs

но - в конце - это будет то же самое (или, возможно, несколько худший из-за переключения контекста), поскольку вам нужно будет поместить весь этот код куда-нибудь (в функцию, верно?).

@ Littlefoot - Да, нам нужно где-то сохранить функцию, которая снова будет переключать контекст для другого разработчика.

Piyush 14.09.2018 08:31

Ах! Извините; на всякий случай, если вы не поняли, что я хотел сказать - я думаю, что ваш запрос в настоящее время в порядке.

Littlefoot 14.09.2018 08:32

Другие вопросы по теме