Как ссылаться на переменную create в ходе выполнения запроса в T-SQL, в предложении WHERE? - PullRequest
1 голос
/ 07 октября 2010

Что действительно говорится в заголовке.

Если я ВЫБИРАЮ [утверждение] КАКИЕ-либо, почему я не могу сослаться на любой столбец в теле предложения WHERE?Есть какой-то обходной путь?Это сводит меня с ума.

Ответы [ 3 ]

3 голосов
/ 07 октября 2010

Это связано с тем, как оператор SELECT транслируется в абстрактное дерево запросов: «все» появляется только в проекционной части результата запроса в дереве, которая находится над фильтрующей частью дерева, поэтому WHERE пункт не может понять «что угодно». Это не какая-то внутренняя деталь реализации, это фундаментальное поведение реляционных запросов: проекция результата происходит после оценки объединений и фильтров.

Действительно тривиально обойти «проблему», сделав иерархию запроса явной:

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

Общее табличное выражение также может использоваться для той же цели:

with cte as (
    select [something] as whatever
    from ...)
select ... from cte
 WHERE whatever = ...;
3 голосов
/ 07 октября 2010

Насколько я знаю, вы не можете напрямую сделать это в SQL Server.

Если вам ДЕЙСТВИТЕЛЬНО нужно использовать псевдоним столбца в предложении WHERE, вы можете сделать это, но, похоже,как излишнее использование подзапроса только для псевдонима:

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

Вам почти наверняка лучше использовать содержимое исходного столбца в предложении WHERE.

2 голосов
/ 07 октября 2010

Это связано с порядком операций в операторе выбора.Предложение WHERE оценивается перед предложением SELECT, поэтому эта информация недоступна.Хотя он доступен в предложении ORDER BY, поскольку он обрабатывается последним.

Как уже упоминалось, подзапрос обойдет эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...