TSQL Order By-硬编码值列表

TSQL Order By-硬编码值列表,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一个查询,其中返回一个记录状态列。记录状态列有几个值,如:“活动”、“已删除”等 我需要按“活动”,然后“删除”,等顺序排列结果 我目前正在创建CTE,以便将每一组记录带到UNION ALL。有没有更好的动态方式来完成查询 谢谢,您可以在这里使用案例 ORDER BY CASE WHEN Status = 'Active' THEN 0 ELSE 1 END ASC 但是如果您有更多的status值,并且希望对Active进行排序,则DELETE ORDER BY CASE WHEN St

我有一个查询,其中返回一个记录状态列。记录状态列有几个值,如:“活动”、“已删除”等

我需要按“活动”,然后“删除”,等顺序排列结果

我目前正在创建CTE,以便将每一组记录带到UNION ALL。有没有更好的动态方式来完成查询


谢谢,

您可以在这里使用
案例

ORDER BY CASE WHEN Status = 'Active' THEN 0 ELSE 1 END ASC
但是如果您有更多的
status
值,并且希望对
Active
进行排序,则
DELETE

ORDER BY CASE WHEN Status = 'Active'  THEN 0 
              WHEN Status = 'Deleted' THEN 1
              ELSE 2 
         END ASC

有关更多状态值,可以执行以下操作:

WITH StatusOrders
AS
(
  SELECT StatusOrderID, StatusName
  FROM (VALUES(1, 'Active'), 
              (2, 'Deleted'),
              ...
              n, 'last status')) AS Statuses(StatusOrderID, StatusName)
)
SELECT *
FROM YourTable t
INNER JOIN StatusOrders s ON t.StatusName = s.StatusName
ORDER BY s.StatusOrderID;

谢谢

嗨,马哈茂德,我收到一个错误:关键字“值”附近的语法不正确。@Bill-你能告诉我你尝试过的确切查询吗?它应该很好用。请注意,在SQL Server 2008中,from中的
值的synatx是新的,如果您使用的是旧版本,它将不会以这种方式工作,您必须
UNION ALL选择这些值。我使用的是SQL Server 2008 R2,似乎我使用的是SQL 2005的一个实例。我在一个2008 R2实例上尝试了上述方法,效果非常好!谢谢。比尔,你需要通过调用cte来完成cte,这样它才能执行。
WITH
cteRiskStatus
AS
(
SELECT  RiskStatusID, RiskStatusName
FROM    (VALUES(1, 'Active'),
               (2, 'Draft'),
               (3, 'Occured'),
               (4, 'Escalated'),
               (5, 'Closed'),
               (6, 'Expired'),
               (7, 'Deleted')) AS RiskStatuses(RiskStatusID, RiskStatusName)
)
SELECT * FROM cteRiskStatus