【问题标题】:How to apply non standard SQL column sort order?如何应用非标准 SQL 列排序顺序?
【发布时间】:2011-11-26 14:08:46
【问题描述】:

考虑下表名为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 被排序为MANVROUWKIND,所以基本上期望的结果应该是这样的:

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

如何创建此查询?

【问题讨论】:

  • 类型列是引用数据表的外键吗?
  • 不,type 列是一个varchar,由.Net enumToString 控制。

标签: sql-server tsql


【解决方案1】:

试试

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。

【讨论】:

  • 嗯...我似乎取消了PackDate 的排序。
  • 我认为最棘手的是按 TYPE 列排序,您可以自己添加其他列,对不起,我也会添加这个
  • 啊,我从来不知道你可以在ORDER 中添加CASE,太好了! :D 谢谢
  • @Kees C. Bakker:是的,这是一个不错的功能!我也将 MSDN 文档中关于这一点的摘录添加到我的答案中
  • @ssl,也许你对此也有一些想法:stackoverflow.com/questions/8279571/…
【解决方案2】:

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

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

【讨论】:

  • 它有效,但我得到了一个更复杂的数据模型。不知道去这里的最佳方式是什么。如果我以后想对VROUWMANKIND 进行排序怎么办?
  • 然后您将更新此参考数据表中 SortPriority 字段中的值。与修改 SQL 查询(或多个查询,如果在其他地方使用此排序顺序)相比,我更喜欢修改参考数据来实现此更改,因为这可能需要重新编译/重新部署。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多