考虑下面名为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
现在我想在Pack
,Type
和Date
上对此表进行排序,但我希望Type
的排序方式与MAN
类似, VROUW
,KIND
,所以基本上理想的结果应该是:
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
如何创建此查询?
答案 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中直接添加对此翻译的支持。