порядок в каждом случае и псевдоним - PullRequest
1 голос
/ 25 марта 2009

Как я могу использовать

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

когда AccountTrxValue является псевдонимом и результатом следующего в «select»?

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

Он не принимает псевдоним из-за случая

(без использования подзапроса)

EDIT:

поэтому кто-то ответил мне, и я сделал это так:

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   

Как я могу написать это более коротким способом? * Я не мог включить ноль в "в" * Мне пришлось сделать 2 случая, потому что кажется, что «desc» должно быть написано после «end»

1 Ответ

2 голосов
/ 25 марта 2009
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

Edit:

-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;
...