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',则会出现错误'无效的列名'
答案 0 :(得分: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
..但这意味着重复&某人未更新两个实例以保持同步的固有风险。
答案 1 :(得分:0)
是。使用“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
答案 2 :(得分:0)
在ORDER BY
子句之前,不能使用列别名。
但您可以使用子查询中定义的列别名。
SELECT x * 10 AS y
FROM (SELECT 123 AS x) tbl