2013-10-23 132 views
0

編輯:我正確使用CASE嗎?

對不起,我沒有在開始時澄清。 CompanyType是SMALLINT,不是null,TotalLicenses爲int,空

基本上我只是想檢查TotalLicenses > 0 if C.CompanyType != 4

我看着幾個參考指南和教程,但我無法找到一個證實,我使用CASE當我打算在這個例子中。

我試圖在Expiration大於或等於Today's date時將「Purchased」列更新爲1,DemoLicense等於0,如果公司類型不是4,TotalLicenses大於0。 4也可以是0

update WebCatalog.Published.DemoTracking 
set Purchased = 1 
from WebCatalog.Published.Company C 
    inner join WebCatalog.Published.RCompany RC 
     on C.RCompany = RC.Link 
    inner join WebCatalog.Published.DemoTracking DT 
     on C.PKey = DT.CompanyPKey and DT.Purchased = 0 
where RC.Expiration >= Cast(GETDATE() as Date) and RC.DemoLicense = 0 
and C.TotalLicenses > 
    Case 
     when C.CompanyType != 4 THEN 0 
    END 
+0

所以,如果'C.CompanyType'等於'4' ,更新應該完成? –

+0

無論C.CompanyType是什麼,都應該進行更新,但如果公司類型不是4,則只應在TotalLicenses大於0時執行更新。 – Adam

回答

0

這是沒有那麼多,你所描述的方式不同:

update WebCatalog.Published.DemoTracking 
set Purchased = 1 
from WebCatalog.Published.Company C 
     inner join WebCatalog.Published.RCompany RC 
      on C.RCompany = RC.Link 
     inner join WebCatalog.Published.DemoTracking DT 
      on C.PKey = DT.CompanyPKey and DT.Purchased = 0 
where RC.Expiration >= Cast(GETDATE() as Date) and RC.DemoLicense = 0 
and (C.TotalLicenses > 0 or C.CompanyType = 4) 
+0

這實際上是我試圖完成的。很簡單的解決方案我不知道我爲什麼過於複雜。我只是將它改爲 (C.CompanyType = 4或C.TotalLicenses> 0),以便它將檢查CompanyType是否爲4,並且如果CompanyType是4,則不檢查TotalLicense – Adam

2

我想你想:

and (C.CompanyType <> 4 AND C.TotalLicenses > 0 
    OR C.CompanyType = 4 AND C.TotalLicenses >= 0 
    ) 

可以簡化(假設這兩個字段不可爲空下)到:

and (C.TotalLicenses > 0 
    OR C.CompanyType = 4 AND C.TotalLicenses = 0 
    ) 

,如果Company.TotalLicenses絕不能有負值,可進一步簡化爲:

and (C.TotalLicenses > 0 
    OR C.CompanyType = 4 
    ) 
+0

不需要'C.TotalLicenses = 0' – Bulat

+0

如果公司類型不是4,則TotalLicenses大於0. **如果它是4,則它可以是0 **「*您是否真的低調投票,因爲查詢可能會有所簡化(並且只有在你假設'TotalLicenses'不能有負值是正確的)? –

+0

[x可以是0]和[x等於0]對我來說不是同等的語句。在這種情況下,我想我們可以忽略「它可以是0部分」。 – Bulat

1

第一我想的情況下的結構不同的DBMS之間變化。所以以下可能不適用於你。

2nd當您不指定否則大小寫返回NULL。與NULL的比較也是NULL,因此該行不會被返回。這意味着你需要一個默認情況。

所以你應該寫:

and C.TotalLicenses > 
    Case 
     when C.CompanyType != 4 THEN 0 
     else -1 
    END 
+0

這似乎是給定表格設置方式的最短解決方案。 TotalLicense可以爲任何原因爲空,但我檢查了表,並沒有空值。如果由於某種原因TotalLicense爲空,會返回一個值或導致查詢崩潰,會發生什麼情況。我問,因爲這是一個存儲過程。 – Adam

+0

@亞當號我想你錯誤地理解了我。如果沒有默認子句,則案例結構將變爲空。 – Taemyr