CASE
to wyrażenie, które zwraca wartość. Nie służy do kontroli przepływu, np. IF
. I nie można użyć IF
w zapytaniu.
Niestety, istnieją pewne ograniczenia z wyrażeniami CASE
, które sprawiają, że wykonywanie tego, co chcesz, jest uciążliwe. Na przykład wszystkie gałęzie w wyrażeniu CASE
muszą zwracać ten sam typ lub być niejawnie wymienialne na ten sam typ. Nie próbowałem tego z ciągami i datami. Nie można również użyć CASE
, aby określić kierunek sortowania.
SELECT column_list_please
FROM dbo.Product -- dbo prefix please
ORDER BY
CASE WHEN @sortDir = 'asc' AND @sortOrder = 'name' THEN name END,
CASE WHEN @sortDir = 'asc' AND @sortOrder = 'created_date' THEN created_date END,
CASE WHEN @sortDir = 'desc' AND @sortOrder = 'name' THEN name END DESC,
CASE WHEN @sortDir = 'desc' AND @sortOrder = 'created_date' THEN created_date END DESC;
Prawdopodobnie prostszym rozwiązaniem (szczególnie, jeśli robi się to bardziej skomplikowane) jest użycie dynamicznego SQL. Udaremnić SQL injection można przetestować wartości:
IF @sortDir NOT IN ('asc', 'desc')
OR @sortOrder NOT IN ('name', 'created_date')
BEGIN
RAISERROR('Invalid params', 11, 1);
RETURN;
END
DECLARE @sql NVARCHAR(MAX) = N'SELECT column_list_please
FROM dbo.Product ORDER BY ' + @sortOrder + ' ' + @sortDir;
EXEC sp_executesql @sql;
Kolejny plus dla dynamicznego SQL, mimo wszystko strach zaopatrywaniem który rozprzestrzenia się o tym: możesz uzyskać najlepszy plan dla każdej zmiany sortowania, zamiast jeden plan, który zoptymalizuje każdą odmianę, której używałeś jako pierwszą. Wykonywana jest również najlepiej powszechnie w niedawnym porównania wydajności wpadłem:
http://sqlperformance.com/conditional-order-by
Byliście na właściwej drodze z oświadczeniem o sprawie. Czy możesz opublikować to, co miałeś i powiedzieć nam, jaki był błąd? –
Wystąpił następujący błąd "Konwersja nie powiodła się podczas przekształcania daty i/lub czasu z ciągu znaków." ponieważ najwyraźniej twoje typy danych muszą być takie same, jeśli używasz instrukcji case. – RiceRiceBaby
Czy możesz opublikować swój kod? –