如何动态地在asc和desc中排序2个SQL字段

use*_*104 5 sql sql-server sql-order-by

我想订购SQL选择查询,其中有2个字段在顺序中.然后我需要决定一个是降序而另一个是升序.怎么做

我想要的东西:

Select * from Customer
Order By Date @asc_or_Desc_date, Name @asc_or_Desc_name
Run Code Online (Sandbox Code Playgroud)

有人有任何想法吗?

我试过这个,但似乎失败了

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
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何排序这个?

Mat*_*lie 5

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
Run Code Online (Sandbox Code Playgroud)


我不想在许多不同的组合中做到这一点.如果你有很多组合,我会根据以下内容做一些...

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
Run Code Online (Sandbox Code Playgroud)

根据需要重复多次......


注意:仅仅因为它可以这样做,并不意味着它应该以这种方式完成.


Nei*_*ght 3

您必须动态创建 SQL 语句才能使用变量:

DECLARE @asc_desc VARCHAR(4);

SET @asc_desc = 'DESC';

DECLARE @sql NVARCHAR(1000);

SET @sql = 'Select * from Customer Order By Date ' + @asc_desc + ', Name';

EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

这将排序 DateDESCENDING和 Name ASCENDING

DESC仅当您想使用默认DESCENDING值时才需要添加ASCENDING