TSQL Order By-硬编码值列表
我有一个查询,其中返回一个记录状态列。记录状态列有几个值,如:“活动”、“已删除”等 我需要按“活动”,然后“删除”,等顺序排列结果 我目前正在创建CTE,以便将每一组记录带到UNION ALL。有没有更好的动态方式来完成查询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
谢谢,您可以在这里使用
案例
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