2012-03-26 11 views
7

Więc powiedzmy, że mam zapytanie jak toUżyj numeru kolumny z klauzuli select w klauzuli where. Wydobywające allias oryginalna nazwa

SELECT a as d,b,c FROM myTable 
    WHERE a=1; 

Czy to możliwe, zamiast a = 1, aby wpisać coś takiego SELECTED.1 = 1 lub jakoś wyodrębnić allias oryginalną nazwą od d = 1 nie działa

+3

Dlaczego chcesz to zrobić? –

+1

@JohnSaunders, ponieważ być może to, co się nazywa, jest złożonym wyrażeniem, którego nie trzeba powtarzać w klauzuli where. –

Odpowiedz

10

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 
Powiązane problemy