sql - 自定义排序顺序 - 如何不重复 Case 语句

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

我有以下数据库和查询。该查询采用两个参数:排序列和方向。但是,我必须向查询添加自定义排序(基于 Fuji 应该排在第一位,Gala 排在第二位,等等)。这部分也可以工作,但它在我的查询中创建重复的代码。因此,我很确定人们不会让我检查这一点。所以我的问题是:有没有办法不重复 CASE 语句?

CREATE TABLE Fruits (
    [type] nvarchar(250),
    [variety] nvarchar(250),
    [price] money
)
GO

INSERT INTO Fruits VALUES ('Apple', 'Gala', 2.79)
INSERT INTO Fruits VALUES ('Apple', 'Fuji', 0.24)
INSERT INTO Fruits VALUES ('Apple', 'Limbertwig', 2.87)
INSERT INTO Fruits VALUES ('Orange', 'Valencia', 3.59)
INSERT INTO Fruits VALUES ('Pear', 'Bradford', 6.05)

DECLARE @sortColumnName nvarchar(MAX) = 'Variety'
DECLARE @sortDirection nvarchar(MAX) = 'ASC'

SELECT ROW_NUMBER() OVER (ORDER BY                   
    CASE WHEN @sortColumnName = 'Variety' AND @sortDirection = 'ASC' 
        THEN 
            CASE f.Variety
                WHEN 'Fuji' THEN 1
                WHEN 'Gala' THEN 2
                ELSE 3
            END     
        END ASC,
    CASE WHEN @sortColumnName = 'Variety' AND @sortDirection = 'DESC' 
        THEN 
            CASE f.Variety
                WHEN 'Fuji' THEN 1
                WHEN 'Gala' THEN 2
                ELSE 3
            END     
        END DESC), *
FROM   Fruits f

最佳答案

您可以将排序键乘以 +1 或 -1,具体取决于是否请求 ASC 或 DESC:

SELECT ROW_NUMBER() OVER (ORDER BY                   
    CASE WHEN @sortColumnName = 'Variety'
         THEN 
            (CASE f.Variety
                WHEN 'Fuji' THEN 1
                WHEN 'Gala' THEN 2
                ELSE 3
            END)     
    END
    * (CASE WHEN @sortDirection = 'ASC' THEN 1 ELSE -1 END)), *
FROM   Fruits f

关于sql - 自定义排序顺序 - 如何不重复 Case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3217141/

相关文章:

sql - SQL 中 C 风格的最小/最大?

php - 检查 `INSERT SELECT`是否实际插入行

sql-server - TRUNCATE 与 DELETE FROM 的优缺点

sql - 如何根据条件选择列?

sql - 如何在SQL中为DateTime添加时间

sql-server-2008 - 链接服务器 "Microsoft.ACE.OLEDB.12.0"的 OLE DB 提供程序 "(null)"返回消息 "Bookmark is invalid."

mysql - 在 SQL 中比较同一个表中的两行,一列相等,另一列组合不相等

mysql - 在出现逗号时向现有 SQL 字符串添加附加内容

SQL 用 'constants' 连接表

sql - 表变量在 sql server 2008 r2 上线程安全吗?