2013-10-23 75 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