2013-10-15 57 views
2

如何根据下面的表结构在我的输出中显示状态码?sql查询不使用状态码表显示状态码

表名:

请求

色谱柱:

RequestID,RequestMessage,RequestStatusID,RequestPriorityID 

假设RequestStatusID转换为:

1 = IN_PROGRESS, 2 = CANCELED, 3 = COMPLETED 

只是为了记录我不允许创建一个新的表来保存请求状态。 我必须以某种方式将它们包含在select语句中,并且请求状态代码是否在select语句中进行了硬编码并不重要。

我只是想知道是否有另一种方式实现这一点,而不使用额外的表。

+0

你可以尝试使用情况下,当 – Miller

回答

1

可以使用CASE

SELECT *, 
     CASE WHEN RequestStatusID = 1 THEN 'IN_PROGRESS' 
      WHEN RequestStatusID = 2 THEN 'CANCELED' 
      ELSE 'COMPLETED' 
     END StatusName 
FROM tableName 
4

Case语句:

SELECT RequestID, 
     CASE RequestStatusID 
     WHEN 1 THEN 'IN_PROGRESS' 
     WHEN 2 THEN 'CANCELED' 
     WHEN 3 THEN 'COMPLETED' 
     END, 
     RequestDesc, 
     RequestPriorityID 
FROM #Request 

还是选择()函数,如果你使用SQL Server 2012:

SELECT RequestID, 
     CHOOSE(RequestStatusID,'IN_PROGRESS','CANCELED','COMPLETED'), 
     RequestDesc, 
     RequestPriorityID 
FROM #Request 
0

您可以使用case,但实际上我喜欢派生表的想法,因为在未来更容易改变:

select 
    R.*, C.Name as RequestStatusName 
from Request as R 
    left outer join (values 
     (1, 'IN_PROGRESS'), 
     (2, 'CANCELED'), 
     (3, 'COMPLETED') 
    ) as C(Id, Name) on C.Id = R.RequestStatusID 

所以,你可以添加你想要的任何数量的列,例如:

select 
    R.*, 
    C.Name as RequestStatusName, 
    C.Description as RequestStatusDescription 
from Request as R 
    left outer join (values 
     (1, 'IN_PROGRESS', 'In progress description'), 
     (2, 'CANCELED', 'Canceled description'), 
     (3, 'COMPLETED', 'Completed description') 
    ) as C(Id, Name, Description) on C.Id = R.RequestStatusID 

,如果你要经常参加它,你可以创建视图:

create view vw_RequestStatusNames 
as 
    select C.Id, C.Name, C.Description 
    from (values 
     (1, 'IN_PROGRESS', 'In progress description'), 
     (2, 'CANCELED', 'Canceled description'), 
     (3, 'COMPLETED', 'Completed description') 
    ) as C(Id, Name, Description) 

,并用它加入时:

select 
    R.*, 
    C.Name as RequestStatusName, 
    C.Description as RequestStatusDescription 
from Request as R 
    left outer join vw_RequestStatusNames as C on C.Id = R.RequestStatusID 

=> SQL FIDDLE DEMO

0

如果你被允许创建一个函数,你可以用Table Valued Function做,因为你不仅可以在这里,但在其他的查询和使用。基本易于维护和一致的结果。

表值函数:

​​

功能的使用和查询(Fiddle demo):

select r.RequestID,r.RequestMessage,r.RequestStatusID, 
     r.RequestPriorityID, s.status 
from Request r join (select id,status from dbo.RequestStatus()) s 
    on r.RequestStatusID = s.id 

结果:

| REQUESTID | REQUESTMESSAGE | REQUESTSTATUSID | REQUESTPRIORITYID |  STATUS | 
|-----------|----------------|-----------------|-------------------|-------------| 
|   1 |   Abcd |    1 |     1 | IN_PROGRESS | 
|   2 |   lmno |    2 |     1 | CANCELED | 
|   3 |   pqrs |    3 |     1 | COMPLETED |