Я правильно использую 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
Другие вопросы по тегам