1

我该如何使用

ORDER BY 
CASE @AccountOperator
WHEN '>' THEN AccountTrxValue 
END ASC,
CASE @AccountOperator
WHEN '<' THEN AccountTrxValue 
END DESC

当 AccountTrxValue 是别名并且是“选择”中以下内容的结果时?

CASE WHEN PAA.RedeemValue>0 THEN
    PAA.RedeemValue * -1 
    ELSE PAA.EarnValue END
    AS AccountTrxValue ,

由于这种情况,它不接受别名

(不使用子查询)

编辑:

所以有人回答了我,我就是这样做的:

ORDER BY 
    CASE 
    WHEN @AccountOperator IS NULL OR @AccountOperator IN ('>','=') THEN
        CASE WHEN PAA.RedeemValue>0 THEN
        PAA.RedeemValue * -1 
        ELSE PAA.EarnValue  END 
    END DESC,  
CASE 
    WHEN @AccountOperator = '<'THEN
        CASE WHEN PAA.RedeemValue>0 THEN
        PAA.RedeemValue * -1 
        ELSE PAA.EarnValue  END 
    END   

我怎样才能用更短的方式写它?*我不能在“in”中包含null *我必须做2个案例,因为似乎“desc”应该写在“end”之后

4

1 回答 1

2
ORDER BY 
    CASE @AccountOperator
        WHEN '>' THEN AccountTrxValue 
        WHEN '<' THEN -AccountTrxValue
    END

您应该被允许在 ORDER BY 子句中使用列别名,假设 SQL Server

否则:

ORDER BY 
    CASE @AccountOperator
        WHEN '>' THEN
        CASE WHEN PAA.RedeemValue>0 THEN
        PAA.RedeemValue * -1 
        ELSE PAA.EarnValue END
    WHEN '<' THEN
        -CASE WHEN PAA.RedeemValue>0 THEN
        PAA.RedeemValue * -1 
        ELSE PAA.EarnValue END
END

编辑:

-AccountTrxValue 或 -CASE WHEN PAA.RedeemValue>0... 简单地否定该值。这意味着默认 ASC 像 DESC 一样工作......

Edit2:非数字的一般情况

DECLARE @Switch char(1);
SELECT @Switch = '<';

SELECT
    *,
    ROW_NUMBER() OVER (ORDER BY SortCol ASC) AS SortASC,
    ROW_NUMBER() OVER (ORDER BY SortCol DESC) AS SortDESC
FROM
    dbo.tablename
ORDER BY 
    CASE @Switch
        WHEN '<' THEN ROW_NUMBER() OVER (ORDER BY SortCol ASC)
        WHEN '>' THEN ROW_NUMBER() OVER (ORDER BY SortCol DESC)
        ELSE 0
    END;
于 2009-03-25T07:03:41.493 回答