2013-10-15 99 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 |