【问题标题】:Can a calculated Column result be used in a second Column as an input? Oracle SQL计算出的 Column 结果可以在第二个 Column 中用作输入吗?甲骨文 SQL
【发布时间】:2019-01-30 20:14:35
【问题描述】:

我在 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

【问题讨论】:

标签: sql oracle case calculated-columns


【解决方案1】:

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

【讨论】:

  • 谢谢!那效果很好。我认为调用 Case 语句比创建子查询更容易。干杯。
【解决方案2】:

一个简单的选项是内联视图,或者 - 最近 - 一个 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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 2023-01-25
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多