Как оптимизировать оператор CASE в запросе SELECT, который имеет одинаковое условие проверки для трех разных столбцов - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть оператор 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.

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

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

1 Ответ

0 голосов
/ 14 сентября 2018

Может быть, я ошибаюсь, но - когда вы говорите, что у вас есть «те же 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

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

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