【问题标题】:order by case and alias按大小写和别名排序
【发布时间】:2009-03-25 06:55:52
【问题描述】:

如何使用

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 ,

因为大小写不接受别名

(不使用子查询)

编辑:

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

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”之后

【问题讨论】:

  • 请用比“orderby”更具体的东西重新标记

标签: sql sql-server sql-order-by


【解决方案1】:
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...

编辑2: 非数字的一般情况

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;

【讨论】:

  • 谢谢 -AccountTrxValue 是什么?我看到 sql server 不接受它,因为这种情况,别名不被接受
  • 我输入了 CASE WHEN PAA.RedeemValue>0 THEN PAA.RedeemValue * -1 ELSE PAA.EarnValue END 插入了别名,它起作用了——谢谢!你能试着回答我对这个问题的编辑吗?
  • 完成。记住我的答案旁边的大勾号;-)
  • 如果要排序的列是 nvarchar 或 datetime,你会怎么做?
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多