Nie można tego zrobić z powodu wewnętrznej złożoności, gdy klauzula WHERE jest oceniana. Ale jeśli to, co wygłaszacie, jest długim wyrazem, którego nie chcielibyście powtórzyć, istnieje typowe rozwiązanie tego problemu. Od https://forums.oracle.com/forums/thread.jspa?threadID=1107532:
Standardowe rozwiązanie to należy przesuwać zapytanie w widoku inline (bez orzeczenia gdzie klauzula), a następnie dodać predykat gdzie klauzula, używając aliasu, w zapytanie zewnętrzne.
Więc coś takiego:
select ...
from (select ... here complex expression that is aliased ...
from ...
where) A
where ... here condition that uses the A.alias column ...
W przykładzie sprawy, że będzie:
SELECT d, b, c
FROM (SELECT a AS d, b, c FROM myTable) AS myAliasedTable
WHERE d = 1
Ale oczywiście, to nie ma sensu w swoim dosłownym przykład. Jeśli rzeczy, którą wysyłasz, to po prostu nazwa kolumny, to po prostu użyj rzeczywistej nazwy kolumny w WHERE, bez prawdziwej wady w tym przypadku.
Należy również zauważyć, że jeśli użyjesz tej metody, powinieneś umieścić w klauzuli WHERE jak najwięcej klauzul WHERE w wewnętrznej kwerendzie (czyli częściach, które nie odwołują się do kolumny aliasowanej), aby ograniczyć rozmiar wynikowej tabela aliasowa. Na przykład, jeśli również chciał sprawdzić na b
w swoim przykładzie, że byłoby:
SELECT d, b, c
FROM (
SELECT a AS d, b, c
FROM myTable
WHERE b = 1
) AS myAliasedTable
WHERE d = 1
Dlaczego chcesz to zrobić? –
@JohnSaunders, ponieważ być może to, co się nazywa, jest złożonym wyrażeniem, którego nie trzeba powtarzać w klauzuli where. –