sql - 如何动态排序 2 个 SQL 字段的 asc 和 desc

标签 sql sql-server sql-order-by

我想要订购一个 SQL 选择查询,其中排序依据中有 2 个字段。然后我需要决定一个是降序,另一个是升序。这是怎么做到的

我想要这样的东西:

Select * from Customer
Order By Date @asc_or_Desc_date, Name @asc_or_Desc_name

有人有什么想法吗?

我已经尝试过,但似乎失败了

SELECT 

    Customer_ID,                        
    Name,                               
    Age                                         

FROM #Customer
ORDER BY 

    CASE WHEN @fieldSort ='Name'
        THEN ROW_NUMBER() over (order by Name) * 
            case when @directionOfSort = 'A' 
                THEN 1 ELSE -1 END,
             ROW_NUMBER() over (order by Age) * 
            case when @directionOfSort = 'A' 
                THEN 1 ELSE -1 END,
        END

有人知道如何排序吗?

最佳答案

SELECT 
  Customer_ID,                        
  Name,                               
  Age                                         
FROM
  #Customer
ORDER BY 
  CASE WHEN @field = 'Name' AND @direction = 'A' THEN Name ELSE NULL END ASC,
  CASE WHEN @field = 'Name' AND @direction = 'D' THEN Name ELSE NULL END DESC,
  CASE WHEN @field = 'Age'  AND @direction = 'A' THEN Age  ELSE NULL END ASC,
  CASE WHEN @field = 'Age'  AND @direction = 'D' THEN Age  ELSE NULL END DESC


不过,我不想在许多不同的组合上这样做。如果你有很多组合,我会根据以下内容做一些事情......

SELECT 
  Customer_ID,                        
  Name,                               
  Age                                         
FROM
(
  SELECT
    Customer_ID,
    Name,
    ROW_NUMBER() OVER (ORDER BY Name) AS "name_order",
    Age,
    ROW_NUMBER() OVER (ORDER BY Age)  AS "age_order"
  FROM
    #Customer
)
  AS [data]
ORDER BY 
  CASE @field1
    WHEN 'Name' THEN CASE @direction1 WHEN 'A' THEN name_order ELSE -name_order END
    WHEN 'Age'  THEN CASE @direction1 WHEN 'A' THEN age_order  ELSE -age_order  END
    ELSE NULL
  END,
  CASE @field2
    WHEN 'Name' THEN CASE @direction2 WHEN 'A' THEN name_order ELSE -name_order END
    WHEN 'Age'  THEN CASE @direction2 WHEN 'A' THEN age_order  ELSE -age_order  END
    ELSE NULL
  END

根据需要重复多次...


注意:仅仅因为可以这样做,并不意味着应该这样做。

关于sql - 如何动态排序 2 个 SQL 字段的 asc 和 desc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4993229/

相关文章:

.net - 在分布式事务中手动登记后,使用 enlist=false 的连接不会关闭

mysql - 当使用 UNION 时,ORDER BY 仅影响其中 1 个查询

mysql - 具有低基数第二列的复合索引是否足以影响性能以至于应该使用它?

PHP Postgres 使用带间隔的特殊输入值

sql - 访问 2010 : Syntax error (missing operator) in query expression

java - 使用spring jdbc时将长(+20行sql)外部化的干净方法?

c# - SQL 数据读取器 : Invalid attempt to read when no data is present

SQL 查询员工入职日期和离职日期之间的数据

mysql - SQL 按最高金额 "kills divided by deaths"排序

MYSQL 使用 LOAD DATA INFILE 将数据从 .csv 导入到特定列的升序