2010-08-17 60 views
0

我試圖改變當前顯示一個Transact-SQL(MS SQL Server)的報告的結果聲明:的if-else在T-SQL

CompanyA  DVCE3 
CompanyB  DVCE2 
CompanyC  DVCE3 
CompanyD  NULL 
CompanyE  DVCE3 

,我想它,而不是展示:

CompanyA  36 
CompanyB  24 
CompanyC  36 
CompanyD  
CompanyE  36 

我敢肯定,這個問題的答案是使用某種類型的if/else語句或case語句,但是我不知道這在T-SQL的語法,或者它應該去我的查詢。

我的基本查詢如下所示:

SELECT 
    companyName 
    , term 
FROM tableA a 
    JOIN tableB b on a.id = b.id ... 
WHERE 
    customerNumber IS NOT NULL 
    AND companyName != 'TEST'... ; 

感謝您的幫助。

+2

執行值36和24來自一個特定的列(也許在另一個表?),還是應該被硬編碼到SQL? – 2010-08-17 21:50:53

+0

他們應該被硬編碼 - 24和36不會被從另一列拿走,這是一個很好的問題。這只是一個更可讀的結果(DVCE3代表3年或36個月)。 – dvanaria 2010-08-17 22:08:05

回答

5

用以下內容替換你的 「術語」 現場:

CASE WHEN term='DVCE3' THEN '36' WHEN term='DVCE2' THEN '24' ELSE '' END as term 

我會重寫它的可讀性:

CASE 
    WHEN term='DVCE3' THEN '36' 
    WHEN term='DVCE2' THEN '24' 
    ELSE '' 
END as term 
+0

+1爲了處理'ELSE'的情況,我沒有注意到這一點。 – 2010-08-17 21:58:53

+0

非常感謝,這個作品。唯一的副作用是,出於某種原因,無論原始返回NULL的任何位置,結果返回數字0. – dvanaria 2010-08-17 22:10:55

+2

@dvanaria - SQL在將數字轉換爲數字時出於某種離奇原因將「'轉換爲0。將所有數字放在單引號中,例如''36',因此它將該列視爲字符串。 – 2010-08-17 22:15:20

4

如果您只有幾個替代品,您可以將它們粘貼在case聲明中,如下所示。

SELECT 
    companyName 
    ,CASE term WHEN 'DVCE3' THEN '36' WHEN 'DVCE2' THEN '24' ELSE '' END AS term 
FROM tableA a 
    JOIN tableB b on a.id = b.id ... 
WHERE 
    customerNumber IS NOT NULL 
    AND companyName != 'TEST'... ; 

如果有更多或你將被重複該邏輯在其他查詢你也許可以設置一個映射表(或者永久表,視圖或內聯TVF),然後可以加入到。

+0

小細節:您還需要處理將NULL轉換爲「'的情況。 – 2010-08-17 21:55:54

+0

@Joe - 哦我沒有注意到這一點。現在將修復感謝。 – 2010-08-17 21:58:05

1

case語句會工作。然而,更好的答案可能是將數據放入表中並進行連接,或者將其放入公司表中的字段中。這使得它從長遠來看更具可擴展性。

CREATE TABLE CompanyTerms (
    id INT, 
    CompanyName NVARCHAR(100) NOT NULL, 
    Term NVARCHAR(100) NULL 
) 

...

SELECT 
    companyName 
    , c.Term 
FROM tableA a 
    JOIN tableB b on a.id = b.id ... 
    JOIN CompanyTerm c ON c.id = a.id 
WHERE 
    customerNumber IS NOT NULL 
    AND companyName != 'TEST'... ; 
+0

這聽起來是一個很好的建議,但對於本報告的範圍,我不必擔心可擴展性問題,至少不會考慮結果中列出的值。 – dvanaria 2010-08-17 22:12:44