繁体   English   中英

SQL Server:如何为案例语句使用手动定义的列名

[英]SQL Server: how to use manually defined column name for case statement

我将以下“选择”用作更大查询的一部分。

这里有人可以告诉我如何在我的Case语句中引用手动定义的名称“ amountUSD ”吗? 尝试以这种方式保存它时,总是出现以下错误:“ Invalid column name 'amountUSD'.

解决方法可能是先将其插入到临时表中,但我希望可以避免这种情况。

SELECT      (CASE WHEN R.currency = 'USD' THEN '1' ELSE E.exchange_rate END) AS exchangeRate,
            (R.amount * E.exchange_rate) AS amountUSD,
            (
                CASE    WHEN amountUSD < 1000 THEN '18' 
                        WHEN amountUSD < 5000 THEN '25' 
                        WHEN amountUSD < 20000 THEN '27' 
                        WHEN amountUSD < 100000 THEN '28' 
                        WHEN amountUSD < 250000 THEN '29' 
                        WHEN amountUSD < 2000000 THEN '30' 
                        WHEN amountUSD < 5000000 THEN '31' END
            ) AS approvalLevel
FROM        Exchange_Rates E
WHERE       E.from_currency = R.currency
AND         E.to_currency = 'USD'
FOR XML     PATH(''), ELEMENTS, TYPE

蒂姆,非常感谢您对此提供的任何帮助。

您不能-因为此时不存在amountUSD。 它仅存在于输出投影中。 您有2个选择:

  • 不使用金额USD或

  • 不使用您的表,而是进行两步查询,首先查询项目金额USD,然后选择该金额并在其中进行验证(approvalLevel)。

这听起来并不像您可以在另一个选择上进行选择那样困难。

这样行吗?

SELECT      (CASE WHEN R.currency = 'USD' THEN '1' ELSE E.exchange_rate END) AS exchangeRate,
            (R.amount * E.exchange_rate) AS amountUSD,
            (
                CASE    WHEN (R.amount * E.exchange_rate) < 1000 THEN '18' 
                        WHEN (R.amount * E.exchange_rate) < 5000 THEN '25' 
                        WHEN (R.amount * E.exchange_rate) < 20000 THEN '27' 
                        WHEN (R.amount * E.exchange_rate) < 100000 THEN '28' 
                        WHEN (R.amount * E.exchange_rate) < 250000 THEN '29' 
                        WHEN (R.amount * E.exchange_rate) < 2000000 THEN '30' 
                        WHEN (R.amount * E.exchange_rate) < 5000000 THEN '31' END
            ) AS approvalLevel
FROM        Exchange_Rates E
WHERE       E.from_currency = R.currency
AND         E.to_currency = 'USD'
FOR XML     PATH(''), ELEMENTS, TYPE

之所以无法在SELECT列表中使用amountUSD,是因为查询处理的逻辑顺序为: http : //tsql.solidq.com/books/insidetsql2008/Logical%20Query%20Processing%20Poster.pdf

我相信以下代码是TomTom所描述的可行解决方案之一。

SELECT  *
        ,(CASE    WHEN amountUSD < 1000 THEN '18' 
                    WHEN amountUSD < 5000 THEN '25' 
                    WHEN amountUSD < 20000 THEN '27' 
                    WHEN amountUSD < 100000 THEN '28' 
                    WHEN amountUSD < 250000 THEN '29' 
                    WHEN amountUSD < 2000000 THEN '30' 
                    WHEN amountUSD < 5000000 THEN '31' END
        ) AS approvalLevel
FROM 
(
    SELECT      (CASE WHEN R.currency = 'USD' THEN '1' ELSE E.exchange_rate END) AS exchangeRate,
                (R.amount * E.exchange_rate) AS amountUSD,
    FROM        Exchange_Rates E
    WHERE       E.from_currency = R.currency
    AND         E.to_currency = 'USD'
) t
FOR XML     PATH(''), ELEMENTS, TYPE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM