如何应用非标准SQL列排序顺序?

时间:2011-11-26 14:08:47

标签: sql-server tsql

考虑下面名为Persons的表:

Key Name    Type    Date        Pack
1   Pocoyo  KIND    30-11-2011  1
2   Erik    MAN     10-10-1980  1
3   Alinda  VROUW   12-12-1991  1
4   Pingu   KIND    11-12-2012  1
5   Elisia  KIND    11-11-2010  1
6   Kees    MAN     10-11-1984  2

现在我想在PackTypeDate上对此表进行排序,但我希望Type的排序方式与MAN类似, VROUWKIND,所以基本上理想的结果应该是:

Key Name    Type    Date        Pack
2   Erik    MAN     10-10-1980  1
3   Alinda  VROUW   12-12-1991  1
5   Elisia  KIND    11-11-2010  1
1   Pocoyo  KIND    30-11-2011  1
4   Pingu   KIND    11-12-2012  1
6   Kees    MAN     10-11-1984  2

如何创建此查询?

3 个答案:

答案 0 :(得分:8)

试试

SELECT * 
FROM Persons
ORDER BY
    Pack,
    CASE Type
        WHEN 'MAN' THEN 1
        WHEN 'VROUW' THEN 2
        WHEN 'KIND' THEN 3
    END,
    Date ASC

MSDN:CASE (Transact-SQL)

  

CASE可用于任何允许有效的语句或子句   表达。例如,您可以在诸如的语句中使用CASE   SELECT,UPDATE,DELETE和SET,以及select_list等子句,   IN,WHERE, ORDER BY 和HAVING。

答案 1 :(得分:3)

我倾向于创建一个新的参考数据表,比如PersonType来保存“Type”列的预期值及其相对排序优先级:

Type   SortPriority
MAN    1
VROUW  2
KIND   3

在此表上执行左外连接以确定针对Persons的查询结果的排序顺序:

SELECT
    *
FROM
    Persons p
LEFT OUTER JOIN PersonType pt on p.Type = pt.Type
ORDER BY
    Pack, 
    SortPriority, 
    Date

答案 2 :(得分:2)

我认为,由于您的意见,您的非标准订单是由枚举中的项目顺序决定的。如果是这种情况,请考虑在数据库中存储值,而不是枚举的名称。在读取/写入数据库时​​,让DAL转换枚举。例如,今天在EntityFramework中我们可以编写一个小的包装类,它成为枚举列的类型,并定义包装器和枚举之间的等价和隐式转换。有关枚举和EF的更多信息,请参阅this answer。在June 2011 CTP EF中直接添加对此翻译的支持。