Próbowałem się rozejrzeć, ale nie mogłem znaleźć niczego, co by mi pomogło.
Próbuję to zrobić w SQL:
declare @locationType varchar(50);
declare @locationID int;
SELECT column1, column2
FROM viewWhatever
WHERE
CASE @locationType
WHEN 'location' THEN account_location = @locationID
WHEN 'area' THEN xxx_location_area = @locationID
WHEN 'division' THEN xxx_location_division = @locationID
Wiem, że nie powinienem umieszczać znaku „= @locationID” na końcu każdego z nich, ale nie mogę uzyskać nawet bliskiej poprawności składni. SQL ciągle narzeka na moje „=” w pierwszym wierszu WHEN ...
W jaki sposób mogę to zrobić?
sql
switch-statement
case
Miles
źródło
źródło
bez opisu sprawy ...
źródło
DECLARE @locationType NVARCHAR(50) = 'youchoose' IF @locationType = 'location' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (account_location = @locationID) END IF @locationType = 'area' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (xxx_location_area = @locationID) END IF @locationType = 'division' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (xxx_location_division = @locationID) END
Proszę bardzo.
źródło
Powiedziałbym, że jest to wskaźnik wadliwej struktury tabeli. Być może różne typy lokalizacji powinny być rozdzielone w różnych tabelach, umożliwiając wykonywanie znacznie bogatszych zapytań, a także unikanie niepotrzebnych kolumn.
Jeśli nie możesz zmienić struktury, może zadziałać coś podobnego do poniższego:
I tak dalej ... Nie możemy zmienić struktury zapytania w locie, ale możemy to zmienić, zrównując predykaty.
EDYCJA: Powyższe sugestie są oczywiście znacznie lepsze, po prostu zignoruj moje.
źródło
Problem polega na tym, że kiedy silnik SQL idzie do oceny wyrażenia, sprawdza część FROM, aby wyciągnąć odpowiednie tabele, a następnie część WHERE, aby podać jakieś podstawowe kryteria, więc nie może poprawnie ocenić dynamicznego warunku, w której kolumnie ma sprawdzić przeciwko.
Możesz użyć klauzuli WHERE podczas sprawdzania kryteriów WHERE w predykacie, takich jak
więc w twoim konkretnym przypadku będziesz musiał umieścić zapytanie w procedurze składowanej lub utworzyć trzy oddzielne zapytania.
źródło
Operator OR może być alternatywą dla przypadku, gdy jest w stanie
źródło
Spróbuj tego zapytania. Odpowiedź na powyższy post:
źródło
Spróbuj tego:
źródło
źródło
źródło
Spróbuj tego zapytania. Bardzo łatwo to zrozumieć:
źródło