Я правильно использую CASE WHEN?
Редактировать:
Извините, я не уточнил в начале. CompanyType имеет тип smallint, а не null, а TotalLicenses имеет тип int, null
В основном я только хочу проверить, что TotalLicenses > 0 if C.CompanyType != 4
Я посмотрел несколько справочных руководств и учебных пособий, но не смог найти ни одного, который подтвердил бы, что я использую CASE WHEN, как я собираюсь сделать в этом примере.
Я пытаюсь обновить столбец "Приобретено" до 1, если срок действия больше или равен сегодняшней дате, DemoLicense равен 0, а TotalLicenses больше 0, если тип компании не равен 4. Если это 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
3 ответа
Это не сильно отличается от того, как вы это описали:
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)
Я думаю, что вы хотите:
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
)
Во-первых, я думаю, что структура дела варьируется между различными СУБД. Таким образом, следующее может не относиться к вам.
2-й, когда вы не указываете Else, случай возвращает NULL. Сравнение с NULL также NULL, поэтому строка не будет возвращена. Это означает, что вам нужен случай по умолчанию.
Так что вы, вероятно, должны написать:
and C.TotalLicenses >
Case
when C.CompanyType != 4 THEN 0
else -1
END