Oracle: использование переменной оператора CASE в операции - PullRequest
0 голосов
/ 01 ноября 2018

У меня следующий запрос SQL:

SELECT PLAYER_ID, 
       PLAYER_CD, 
       TEAM_ID, 
       USR_FNM, 
       USR_MNM, 
       USR_LNM,
       CASE 
           WHEN TEAM_ID = '11111111111111' THEN SIGN_DT
           ELSE START_DT
       END AS ASGN_DT
FROM PLAYER P 
JOIN TEAM T ON P.PLAYER_TEAM_ID = T.TEAM_ID 
JOIN USR U ON P.PLYAER_USR_ID = USR_ID;

Я пытаюсь добавить следующее поле в запрос SELECT, чтобы получить количество дней с даты, полученной с помощью оператора CASE, до настоящего времени:

(TRUNC(SYSDATE) - TRUNC(ASGN_DT))

Но когда я это делаю, я получаю эту ошибку:

ORA-00904: "ASGN_DT": неверный идентификатор

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Не trunc псевдоним ASGN_DT, но case вместо

 CASE 
       WHEN TEAM_ID = '11111111111111' THEN SIGN_DT
       ELSE START_DT
   END 

Вы также можете заменить длинную инструкцию case на более короткую декодировать функцию:

 decode(TEAM_ID, '11111111111111', SIGN_DT, START_DT)
0 голосов
/ 01 ноября 2018

Я использовал подзапрос в своем соединении, как показано ниже, чтобы достичь того, что я пытался сделать.

SELECT PLAYER_ID, 
       PLAYER_CD, 
       TEAM_ID, 
       USR_FNM, 
       USR_MNM, 
       USR_LNM,
       ASGN_DT
FROM PLAYER P 
JOIN (SELECT
    CASE 
        WHEN TEAM_ID = '11111111111111' THEN SIGN_DT
        ELSE START_DT
    END AS ASGN_DT
    FROM TEAM T) T ON P.PLAYER_TEAM_ID = T.TEAM_ID 
JOIN USR U ON P.PLYAER_USR_ID = USR_ID;
0 голосов
/ 01 ноября 2018

ASGN_DT - это последний псевдоним, который вы увидите в наборе результатов, но он не виден в самом запросе.

Решение? Оберните ваш запрос как подзапрос. Для внешнего запроса будет виден столбец ASGN_DT. Например:

select
    *,
    (TRUNC(SYSDATE) - TRUNC(ASGN_DT)) as diff
from (
  SELECT PLAYER_ID, 
         PLAYER_CD, 
         TEAM_ID, 
         USR_FNM, 
         USR_MNM, 
         USR_LNM,
         CASE 
             WHEN TEAM_ID = '11111111111111' THEN SIGN_DT
             ELSE START_DT
         END AS ASGN_DT
  FROM PLAYER P 
  JOIN TEAM T ON P.PLAYER_TEAM_ID = T.TEAM_ID 
  JOIN USR U ON P.PLYAER_USR_ID = USR_ID
) x;

Вы также можете использовать CTE (Common Table Expression).

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