Przepraszam, jeśli to duplikat, ale go nie znalazłem. Dlaczego nie mogę użyć mojego aliasu kolumny zdefiniowanego w SELECT
z ORDER BY
, kiedy używam CASE
?Dlaczego nie mogę odwołać się do aliasu kolumny w ZAMÓWIENIU, używając CASE?
Rozważmy proste zapytanie:
SELECT NewValue=CASE WHEN Value IS NULL THEN '<Null-Value>' ELSE Value END
FROM dbo.TableA
ORDER BY CASE WHEN NewValue='<Null-Value>' THEN 1 ELSE 0 END
wynik jest błąd:
Invalid column name 'NewValue'
Here's a sql-fiddle. (Wymień ORDER BY NewValue
z CASE WHEN...
that' w komentarzu)
wiem mogę użyć ORDER BY CASE WHEN Value IS NULL THEN 1 ELSE 0 END
jak here w tym przypadku, ale w rzeczywistości zapytanie jest bardziej złożone i t, aby było to tak czytelne, jak to tylko możliwe. Czy zamiast tego muszę użyć sub-zapytania lub CTE, jeśli tak, dlaczego tak jest?
Aktualizacja Mikael Eriksson komentuje każdy ekspresję w połączeniu z aliasu nie jest dozwolone. Więc nawet to (zapytanie bezcelowe) nie z tego samego powodu:
SELECT '' As Empty
FROM dbo.TableA
ORDER BY Empty + ''
Wynik:
Invalid column name 'Empty'.
więc aliasem jest dozwolone w ORDER BY
a także wyrazem ale nie oba. Dlaczego, jest zbyt trudne do wdrożenia? Ponieważ jestem głównie programistą, myślę o aliasach jako zmiennych, które można by łatwo wykorzystać w wyrażeniu.
Dlaczego nie zawijać warunek sprawy w zewnętrznym zastosowaniu i porządku przez to pole? –
@AndyKorneyev: Wiem też, jakie są tego rozwiązania, ale zastanawiałem się, dlaczego to nie jest dozwolone. Wydaje się, że jest to dość powszechne i pseudonim ma ukrywać złożoność, więc dlaczego nie mogę tego zrobić, jeśli mogę normalnie używać aliasów w "ORDER BY"? –
Jest tu długa dyskusja (może nieco nieaktualna): http://social.msdn.microsoft.com/Forums/sqlserver/en-US/4ad14cad-1e61-43a0-96f8-70a506106a00/column-alias-usage -wszyscy-w-zapytanie-po-definicja-forum? forum = transactsql – davek