Próbuję napisać zapytanie SQL, takie jak to poniżej

select [ProductId], [Product]
from Products p
where p.ProductType = case 
                  when @condition1 then 'p'
                  when @condition2 then 'p','c'
                  else p.ProductType 
                end

Jak mogę to osiągnąć?

  1. gdy @ condition1 jest prawdziwe, chcę uzyskać produkty, w których productType = 'p'
  2. gdy @ condition2 jest prawdziwe, chcę uzyskać produkty, w których productType w ('p', 'c')
  3. gdy oba warunki są fałszywe, pobierz wszystkie produkty
sql
-2
varun m 31 marzec 2020, 23:12

3 odpowiedzi

Najlepsza odpowiedź

Twoja logika może zostać wyrażona bez użycia case:

select [ProductId], [Product]
from Products p
where (@conditionn1 and p.ProductType = 'p') or
      (@conditionn2 and p.ProductType in ('p', 'c')) or
      ( (not @conditionn1) and (not @conditionn2) )
1
Gordon Linoff 31 marzec 2020, 21:23

Nie możesz przekazać wielu wartości w ten sposób, ponieważ p.ProductType można ustawić za pomocą wartości skalarnej; raczej będziesz musiał powtórzyć ten sam warunek jak

where p.ProductType = case 
                  when @conditionn1 then 'p'
                  when @conditionn2 then 'p'
                  when @conditionn2 then 'c'
                  else p.ProductType 
                end
0
Rahul 31 marzec 2020, 20:21

Witamy!

Nie jestem pewien, czy rozumiem twoje pytanie, ale tak bym przepisał:

SELECT 
    ProductId, 
    Product,
    CASE
        WHEN p.ProductType = "CONDITION1" THEN 'p'
        WHEN p.ProductType = "CONDITION2" THEN 'c'
        ELSE 'ERROR'
    END
FROM
    Products p
1
Z41N 31 marzec 2020, 20:21