计算的 Column 结果是否可以在第二个 Column 中用作输入?甲骨文 SQL

Can a calculated Column result be used in a second Column as an input? Oracle SQL

我在 Oracle 中有一个 SQL 查询,它有一个使用 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

一个简单的选项是内联视图,或者 - 最近 - CTE(常见 table 表达式)又名 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

您可以在子查询中生成该列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

您收到错误消息是因为 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