Можно ли использовать вычисленный результат столбца во втором столбце в качестве входных данных?Oracle SQL - PullRequest
0 голосов
/ 30 января 2019

У меня есть SQL-запрос в Oracle, в котором есть вычисляемый столбец с использованием операторов case.Я хотел бы использовать вновь созданный столбец в качестве входных данных для второго вычисляемого столбца.Пожалуйста, смотрите мой код ниже.

Когда я пытаюсь запустить это, я получаю ошибку «PAYER_TYPE»: неверный идентификатор.Так будет ли способ использовать значения "PAYER_TYPE" во втором столбце?

SELECT 
CASE 
WHEN TYP IN ('Swap', 'Ton') 
THEN 
    CASE
     WHEN INDX_PAY = 'FIXED' 
     THEN 'FIXED'
     ELSE 'FLAT' 
    END
END AS PAYER_TYPE,

CASE
WHEN TYPE = 'Swaption' 
THEN
    CASE
        WHEN PAYER_TYPE = 'FIXED' 
        THEN PAY_LEG 
        ELSE REC_LEG 
    END
ELSE 0
END AS STRIKE
FROM Hedge.Details

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Вы можете создать этот столбец PAYER_TYPE в подзапросе, а затем использовать его во внешней части

  SELECT 
        PAYER_TYPE,
        CASE
        WHEN TYP = 'Swaption' 
        THEN
            CASE
                WHEN PAYER_TYPE = 'FIXED' 
                THEN 'PAY_LEG' 
                ELSE 'REC_LEG'
            END
        ELSE '0'
        END AS STRIKE
    FROM
    (
    WITH Details(TYP,INDX_PAY) AS
    (
     SELECT 'Swap', 'FIXED' FROM DUAL UNION ALL
     SELECT 'Ton' , 'FIX'   FROM DUAL   
    )
    SELECT 
    CASE 
    WHEN TYP IN ('Swap', 'Ton') 
    THEN 
        CASE
         WHEN INDX_PAY = 'FIXED' 
         THEN 'FIXED'
         ELSE 'FLAT' 
        END
    END PAYER_TYPE,
        TYP
    FROM Details
    )

PAYER_TYPE  STRIKE
----------  ------
FIXED       0
FLAT        0
0 голосов
/ 31 января 2019

Вы получаете сообщение об ошибке, поскольку PAYER_TYPE не является столбцом в Hedge.Details.Если вы действительно хотите использовать PAYER_TYPE, попробуйте следующее:

SELECT
  C1.PAYER_TYPE,
  CASE  
    WHEN C1.TYPE = 'Swaption'  
      THEN
        CASE
          WHEN C1.PAYER_TYPE = 'FIXED' 
          THEN C1.PAY_LEG 
          ELSE C1.REC_LEG 
        END
      ELSE 0
  END AS STRIKE
FROM
(
  SELECT
    CASE
      WHEN TYP IN ('Swap', 'Ton')
        THEN
          CASE
            WHEN INDX_PAY = 'FIXED'
              THEN 'FIXED'
              ELSE 'FLAT'
            END
    END AS PAYER_TYPE,
    TYPE,
    PAY_LEG,
    REC_LEG
  FROM Hedge.Details
) AS C1

Лучшим вариантом может быть простота и не использовать подход подзапроса, как показано ниже:

SELECT
  CASE 
    WHEN TYP IN ('Swap', 'Ton') 
      THEN 
        CASE
          WHEN INDX_PAY = 'FIXED' 
            THEN 'FIXED'
            ELSE 'FLAT' 
          END
  END AS PAYER_TYPE,
  CASE
    WHEN TYPE = 'Swaption' 
      THEN
        CASE
          WHEN TYP IN ('Swap', 'Ton') AND INDX_PAY = 'FIXED' 
            THEN PAY_LEG 
            ELSE REC_LEG 
          END
      ELSE 0
  END AS STRIKE
FROM Hedge.Details
0 голосов
/ 30 января 2019

Простая опция - это встроенное представление, или - недавно - CTE (общее табличное выражение), то есть предложение факторизации WITH.Как то так:

with your_data as
  (select case when ... then ...
               when ... then ...
          end paper_type                       --> PAPER_TYPE gets its value here ...
   from some_table
   where ...
  )
select case when y.paper_type = 'A' then ...   --> ... and is reused here
            when y.paper_type = 'B' then ...
       end result
from your_data y
...