【问题标题】:Order by cases- sorting by dynamic column按案例排序-按动态列排序
【发布时间】:2017-09-18 10:17:01
【问题描述】:

在我的程序中,我有:

SELECT
    Col1,
    Col2,
    (Col1+ Col2) AS Col3
FROM Table1
ORDER BY 
    CASE WHEN @SortColumn='Col1' THEN Col1 END ASC,
    CASE WHEN @SortColumn='Col3' THEN Col3 END ASC -- PROBLEM HERE

问题是我无法按Table1 中不存在的列进行排序。我尝试了CASE WHEN @SortColumn='Col3' THEN 'Col3' END ASC,但它也不起作用。

【问题讨论】:

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


    【解决方案1】:

    使用 CTE 或子查询:

    with t as (
          select col1, col2, (col1 + col2) as col3
          . . .
         )
    select t.*
    from t
    order by (case when @SortColumn = 'Col1' then col1 end) asc,
             (case when @SortColumn = 'Col2' then col2 end) asc;
    

    【讨论】:

    • 可能的错字:+ / =
    【解决方案2】:

    另一个 sql-server 选项是 CROSS APPLY

    SELECT
        Col1,
        Col2,
        ca.Col3
    FROM Table1
    CROSS APPLY( 
          SELECT (Col1 + Col2) AS Col3
    ) ca
    ORDER BY 
        CASE WHEN @SortColumn='Col1' THEN Col1 END ASC,
        CASE WHEN @SortColumn='Col3' THEN ca.Col3 END ASC
    

    【讨论】:

      【解决方案3】:

      问题是我无法按 Table1 中不存在的列进行排序。我尝试使用 CASE WHEN @SortColumn='Col3' THEN 'Col3' END ASC 但它也不起作用。

      如果您的列类型(Col1Col2)是 varchar,您应该可以直接使用 CONCAT()

      ...
      ORDER BY 
          CASE WHEN @SortColumn='Col1' THEN Col1 END ASC,
          CASE WHEN @SortColumn='Col3' THEN CONCAT(Col1,Col2) END ASC
      

      在其他情况下,您可以使用CONVERT() 函数将列转换为字符串,然后进行连接。

      【讨论】:

      • 不确定 CONCAT 是否适用于整数(假设 col1 和 col2 是整数,OP 未指定)
      • @MaxiWheat 好吧......因为 OP 没有指定他/她想要什么,所以不应该对我的解决方案投反对票,对吧?当然 - 我做了一个假设,但是这里有很多关于 SO 的问题,假设是必要的。无论如何,我现在已经澄清了我的假设。
      • 其实... OP 使用(Col1 + Col 2) as Col3,所以在任何情况下使用 CONCAT() 都可能是矫枉过正。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2018-10-23
      相关资源
      最近更新 更多