/ / Jak odnieść się do zmiennej tworzonej podczas wykonywania zapytania w T-SQL, w klauzuli WHERE? - sql, tsql

Jak odwołać się do zmiennej tworzonej podczas wykonywania zapytania w T-SQL, w klauzuli WHERE? - sql, tsql

Co naprawdę mówi tytuł.

Jeśli WYBIERZ [statement] JAKO Cokolwiek, dlaczego nie mogę odwołać się do jakiejkolwiek kolumny w treści klauzuli WHERE? Czy jest jakiś sposób obejścia? To doprowadza mnie do szału.

Odpowiedzi:

3 dla odpowiedzi № 1

O ile mi wiadomo, nie można tego bezpośrednio zrobić na serwerze SQL.

Jeśli NAPRAWDĘ musisz użyć swojego aliasu kolumny w klauzuli WHERE, możesz to zrobić, ale wydaje się, że przesadą jest użycie podkwerendy tylko dla aliasu:

SELECT *
FROM
(
SELECT [YourColumn] AS YourAlias, etc...
FROM Whatever
) YourSubquery
WHERE YourAlias > 2

Jesteś prawie na pewno lepiej wykorzystując zawartość oryginalnej kolumny w klauzuli WHERE.


3 dla odpowiedzi № 2

Ma to związek ze sposobem, w jaki dostaje się instrukcja SELECTprzetłumaczone na abstrakcyjne drzewo zapytań: "cokolwiek" pojawia się tylko w części wyniku projekcji zapytania, która znajduje się nad filtrującą częścią drzewa, więc klauzula WHERE nie może zrozumieć "cokolwiek". Nie jest to jakiś wewnętrzny szczegół implementacji, jest to podstawowe zachowanie zapytań relacyjnych: pojawia się projekcja wyniku po ocena połączeń i filtrów.

Jest naprawdę trywialne, aby obejść "problem" poprzez wyraźną hierarchię zapytania:

select ...
from (
select [something] as whatever
from ...
) as subquery
WHERE whatever = ...;

Wspólne wyrażenie tabel może również służyć do tego samego celu:

with cte as (
select [something] as whatever
from ...)
select ... from cte
WHERE whatever = ...;

2 dla odpowiedzi nr 3

Ma to związek z kolejnością operacji wwybierz instrukcję. Klauzula WHERE jest oceniana przed klauzulą ​​SELECT, więc ta informacja nie jest dostępna, chociaż jest dostępna w klauzuli ORDER BY, ponieważ jest przetwarzana jako ostatnia.

Jak wspomnieli inni, pod-zapytanie obejmie ten problem.