2009-03-14 13 views
20

Czy można użyć instrukcji Case w klauzuli sql From przy użyciu SQL 2005? Na przykład, próbuję coś takiego:Czy można użyć instrukcji Case w sql Od klauzuli

SELECT Md5 FROM 
CASE 
    WHEN @ClientType = 'Employee' THEN @Source = 'HR' 
    WHEN @ClientType = 'Member' THEN @Source = 'Other' 
END CASE 
WHERE Current = 2; 

Odpowiedz

6

Zakładając serwer SQL:

Musisz użyć dynamicznego SQL. Zbuduj ciąg, a następnie wywołaj sp_executesql z ciągiem.

Edycja: Jeszcze lepiej, użyj instrukcji if, aby wykonać odpowiednią instrukcję i przypisz wartość do zmiennej. Powinieneś unikać dynamicznego SQL, jeśli to możliwe.

0

Ponieważ nie precyzują, co SQL backend idziesz przeciw, to trudno będzie poprawnie odpowiedzieć ....

miarę Mogę powiedzieć, że nie będziesz mógł tego zrobić ani przeciwko MS SQL Server, ani przeciwko Interbase/Firebird. Nie mogę mówić za innych serwerów backend, choć ...

Marca

0

myślę, że to całkiem śmiało powiedzieć, że odpowiedź jest w żaden sposób. I to niezależnie od dialektu SQL.

22

Nie wierzę, że to możliwe. Po pierwsze, optymalizatory zapytań przyjmują określoną listę rzeczy podobnych do tabeli w klauzuli FROM.

Najbardziej proste obejście, że mogę myśleć byłoby UNION między dwoma tabelami:

SELECT md5 
FROM hr 
WHERE @clienttype = 'Employee' 
AND  current = 2 
UNION 
SELECT md5 
FROM other 
WHERE @clienttype = 'Member' 
AND  current = 2; 

Tylko jedna połowa Unii mogłaby być prawda, biorąc pod uwagę orzeczenie @clienttype.

+0

Zwykle byłoby napisać if, ale przy stosowaniu tej strategii w połączeniu z „dodaje się” to ratuje mnie od konieczności Pisz wielokrotnie część wstawki, uwielbiam to rozwiązanie, dziękuję, zrobię to w ten sposób od teraz, kiedy to będzie możliwe. :) –

+0

Należy pamiętać, że warunek "WHERE" jest wykonywany dla każdego wiersza w tabeli. Więc może nie być opcją, jeśli warunek jest nieco bardziej skomplikowany i są miliony wierszy. –

1

Nie, nie można wybrać tabeli do zapytania przy użyciu instrukcji CASE. Instrukcje CASE pasują tylko do wyrażeń, na przykład do wartości kolumny lub jako część wyrażenia WHERE.

To powinno wystarczyć, jeśli szukasz tylko jedną wartość:

IF @ClientType = 'Employee' BEGIN 
    SET @Source = (SELECT Md5 FROM HR WHERE Current = 2) 
END 
ELSE IF @ClientType = 'Member' BEGIN 
    SET @Source = (SELECT Md5 FROM Other WHERE Current = 2) 
END 
+0

Jako "długie ręce", jak to jest, jest to podejście, które bym podjął (ale nie oddał głosów: - /). Chciałbym raczej użyć narzędzia do generowania SQL statycznie (co jest, 3 linie Ruby lub 1 linia Perla? :-) kontra radzenia sobie z dynamicznym SQL (kiedy _eduję_ dynamiczny SQL, nie znajduję niczego poza wstrętem dla wymagające dynamicznego SQL). –

Powiązane problemy