2012-06-27 8 views

Odpowiedz

21

zwraca tylko wartość skalarną. Możesz to zrobić zamiast tego. (Zakładam, jak na swoim przykładzie, że gdy @StatusID = 99, wartość StatusId z 99 nie jest mecz.)

select * 
from MyTable 
where (@StatusID = 99 and StatusID in (5, 11, 13)) 
    or (@StatusID <> 99 and StatusID = @StatusID) 
+1

@ LittleBobbyTables Z twoim imieniem, jestem pewien, że możesz to zmienić z tyłu :) – RedFilter

+0

Dzięki! Świetne rozwiązanie! – crjunk

3

nr Zamiast tego, można umieścić go na zewnątrz

SELECT * 
FROM MyTable 
WHERE 1 = (CASE WHEN @StatusID = 99 and StatusId in (5, 11, 13) then 1 
       WHEN coalesce(@StatusId, 0) <> 99 and StatusId in (@StatusID) then 1 
       ELSE 0 
      END) 

Możesz również napisać to bez instrukcji case.

Inną opcją jest dynamiczny SQL, w którym w rzeczywistości tworzy się ciąg znaków za pomocą instrukcji SQL, a następnie wykonuje się go. Jednak dynamiczny SQL w tym przypadku wydaje się przesadą.

+1

Zastanawiam się nad tą składnią po przeczytaniu czyjejś instrukcji wsadowej, a teraz wiem, dlaczego jest używana. Świetna wskazówka, dzięki, @ gordon-linoff – Sung

0

Myślałem, że spróbuję inaczej, używając konstruktora wartości stojących - czy TVC nie są dozwolone w następującym kontekście?

SELECT * 
FROM MyTable 
WHERE StatusID IN 
    ( 
    SELECT 
     CASE 
     WHEN @StatusID = 99 THEN (values(5),(11),(13)) t(StatusID) 
     ELSE @StatusID 
    END 
    ) 
0

Można to zrobić za pomocą TVC, ale podejście jest nieco inne. To nie przypadek użycia, ale będzie to skala bardziej estetycznie gdzie istnieje kilka możliwych opcji do wyboru:

SELECT * 
FROM MyTable 
join (values 
     (99,5),(99,11),(99,13), 
     (@StatusID , @StatusID)  
    ) t(k,v) on t.k= @StatusID and t.v = StatusID) 

lub jeśli trzeba wszystko w klauzuli WHERE następnie:

SELECT * 
FROM MyTable 
WHERE exists (
    select 1 
    from (values 
     (99,5),(99,11),(99,13), 
     (@StatusID , @StatusID)  
    ) t(k,v) 
    where t.k= @StatusID and t.v = StatusID) 
Powiązane problemy