[T-SQL] Case w where - pomoc w zapytaniu

0

Witam,

Mam taką tabelę:

CREATE table #products(
           productid int,
           brand int
           )

           insert into #products (productid, brand) values (1,10045)
           insert into #products (productid, brand) values (2,10045)
           insert into #products (productid, brand) values (3,10036)
           insert into #products (productid, brand) values (4,10045)
           insert into #products (productid, brand) values (5,10036)
           insert into #products (productid, brand) values (6,10036)
           insert into #products (productid, brand) values (7,10045)
           insert into #products (productid, brand) values (8,10045)

Chcę napisać zapytanie, które na podstawie podanej wartości do zmiennej @emp (pracownik) pokaże mi produkty odpowiedniego brandu.

Zrobiłem coś takiego:

declare @emp varchar(5) = '222'

 select * from #products 
 where brand in 
 (case when @emp = 111 then 10045
        when @emp = 222 then 10036 end )

Dla @emp =222 pokaze mi produkty z brandu 10036, dla @emp = 111 - brand 10045.

Problem w tym że nie wiem jak skonstruować zapytanie, żeby np. dla @emp = '000' pokazywało mi wszystkie produkty, nawet te nie z tych 2 brandów. Coś tam kombinowałem z isnull oraz coalesce, ale nie wiem czy dobrze

1
DECLARE @emp VARCHAR(5) = '222'

 SELECT * FROM #products 
 WHERE (@emp='000' or brand IN 
 (CASE WHEN @emp = '111' THEN 10045
        WHEN @emp = '222' THEN 10036 END ))
1

Witam,

Wszystko fajnie tylko, że w takim przypadki jeżeli będziesz modyfikował tabelę "products" (np dodawał lub modyfikował rekordy) to będziesz za każdym razem musiał modyfikować CASE'a w WHERE.
Moja rada jest taka żebyś stworzył dodatkową tabelę gdzie będziesz przechowywał "połączenia" pracowników z marką (np. tabela "empbrand": kolumny "id_emp", "id_brand") i wtedy zamiast CASE napisałbym podzapytanie. Wtedy uniezależniasz się od zmian w tabeli "products".

DECLARE @emp VARCHAR(5) = '222'

 SELECT 
      *
FROM 
      #products 
 WHERE
      brand IN (SELECT id_brand FROM empbrand WHERE id_emp = @emp)

wtedy nie musisz się zastanawiać gdzie coś zmienić jak dojdą Ci nowe dane :)

1

Ja dopisze tylko, że case w ogóle nie jest potrzebny:

SELECT * FROM #products 
 WHERE
    @emp='000'
    or (@emp = '111' and brand = 10045)
    or (@emp = '222' and brand = 10036)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0