【发布时间】:2011-07-31 11:09:48
【问题描述】:
我有一张表,其中status 可以是GOLD、SILVER、ACTIVE 或INACTIVE。
我想按那个顺序排序...并取前 X。我怎样才能在我的查询中写出来?
目前我正在填写一个列表,首先查询GOLD,然后检查列表的大小,然后查询SILVER,然后再次检查大小等。
【问题讨论】:
我有一张表,其中status 可以是GOLD、SILVER、ACTIVE 或INACTIVE。
我想按那个顺序排序...并取前 X。我怎样才能在我的查询中写出来?
目前我正在填写一个列表,首先查询GOLD,然后检查列表的大小,然后查询SILVER,然后再次检查大小等。
【问题讨论】:
SELECT TOP X *
FROM myTable
ORDER BY
CASE
WHEN Status = 'GOLD' THEN 4
WHEN Status = 'SILVER' THEN 3
WHEN Status = 'ACTIVE' THEN 2
WHEN Status = 'INACTIVE' THEN 1
END DESC
【讨论】:
如果你做得很好,你真的应该把它规范化到一个单独的表中:
statusvalues
id displaytext sortorder
1 GOLD 10
2 SILVER 20
3 ACTIVE 30
4 INACTIVE 40
然后将 id 作为您的状态值存储在主表上。从您的主表连接到此表,以获取显示文本和排序顺序,并进行适当的排序。
NB 1 我在排序顺序中留下了空隙,所以如果你必须插入另一个,你可以把它放在例如15 无需更改任何其他值。 NB 2 这意味着,如果您的客户决定“GOLD”现在应显示为“PREMIUM”,则您更改 1 个数据项值,并且您的代码保持不变。可能会为您节省很多时间...! 但这可能是矫枉过正 - 由您来评估。
【讨论】:
id 列设为四字节 int,将其设为单字节 tinyint 或将其称为 WidgetStatusCode 并将其设为 char(1)。
这可能对某人有所帮助。假设您有一个表(MyTable),其中有一列(StatusTypeID)作为“StatusTypes”表的外键。您可以像这样实现一个过程来进行动态排序。
CREATE PROCEDURE DynamicSort(@SortOrder int)
AS
BEGIN
SELECT * FROM MyTable
ORDER BY
CASE WHEN StatusTypeID = @SortOrder then 1
END
DESC
END
-- exec DynamicSort 7
【讨论】: