【问题标题】:Can calculated column be used in another calculated column?计算列可以在另一个计算列中使用吗?
【发布时间】:2009-11-08 00:19:00
【问题描述】:
SELECT ExchangeRatePrice = CASE pp.Price
     WHEN NULL THEN 0
       ELSE (CASE WHEN c.CurrencyId = 1 THEN pp.Price 
       ELSE CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) END)
     END , 

     price as OriginalPriceInDB,
     10 * Price as CalculatedPrice,
    c.currencyid as Currency

FROM ProductPrice pp, currency c

alt text http://img682.imageshack.us/img682/3692/exchangerate.png

我希望在 CalculatedPrice 中使用计算列 (ExchangeRatePrice)。我可以直接使用吗?我需要重新转换它吗?

我使用 10 * Price 只是为了向您展示示例,因为如果我在这里使用 'ExchangeRatePrice' 会给出错误 'Invalid Column name'

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    在 SQL 中引用预先计算的值通常意味着在内部查询(AKA 内联视图)中执行计算:

    SELECT x.exchangerateprice,
           x.OriginalPriceInDB,
           10 * x.exchangerateprice AS CalculatedPrice,
           x.currencyid
      FROM (SELECT CASE 
                     WHEN pp.price IS NULL THEN
                       0
                     WHEN c.CurrencyId = 1 THEN 
                       pp.Price
                     ELSE 
                       CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) 
                   END AS ExchangeRatePrice,
                  price as OriginalPriceInDB,
                  c.currencyid as Currency
             FROM PRODUCTPRICE pp, 
                  CURRENCY c) x
    

    这相当于使用WITH 子句(在 SQL Server 2005+ 中可用) - 性能没有差异。

    你可以复制逻辑:

    SELECT CASE 
             WHEN pp.price IS NULL THEN
               0
             WHEN c.CurrencyId = 1 THEN 
               pp.Price
             ELSE 
               CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) 
           END AS ExchangeRatePrice,
           price as OriginalPriceInDB,
           CASE 
              WHEN pp.price IS NULL THEN
                0
              WHEN c.CurrencyId = 1 THEN 
                pp.Price
              ELSE 
                CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) 
            END * 10 AS CalculatedPrice,
            c.currencyid as Currency
       FROM PRODUCTPRICE pp, 
            CURRENCY c
    

    ..但这意味着有人不更新两个实例以保持同步的重复和固有风险。

    【讨论】:

      【解决方案2】:

      是的。使用“WITH”(公用表表达式)

      With MainT as (
          SELECT CASE pp.Price
              WHEN NULL 
              THEN 0
              ELSE (
                  CASE WHEN c.CurrencyId = 1 THEN pp.Price
                  ELSE CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) END
                  )
              END ExchangeRatePrice,
              price as OriginalPriceInDB,
              c.currencyid as Currency
          FROM ProductPrice pp, currency c
      )
      select *,  10*ExchangeRatePrice as CalculatedPrice
      from MainT
      

      【讨论】:

      • 只有 SQL Server 2005+ 支持 WITH 子句。
      【解决方案3】:

      ORDER BY 子句之前,您不能使用列别名。

      但您可以使用在子查询中定义的列别名。

      SELECT x * 10 AS y
      FROM (SELECT 123 AS x) tbl
      

      【讨论】:

        猜你喜欢
        • 2019-12-25
        • 2021-09-08
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        • 2021-07-15
        • 2019-11-23
        • 2013-10-11
        • 2010-12-09
        相关资源
        最近更新 更多