Select sql as: Оператор SQL AS: синтаксис, примеры

Столбец с псевдонимом оператора SQL Server AS в операторе WHERE

Я хочу выполнить запрос, в котором я переименовываю один из столбцов с помощью оператора «AS» и повторно использую это имя столбца с псевдонимом в операторе «WHERE». Ниже приведен пример:

 ВЫБЕРИТЕ широту КАК широту
ОТ poi_table
ГДЕ широта < 500
 

Проблема здесь в том, что SQL Server не любит этот запрос из-за предложения WHERE и имени оператора AS, указанного в предложении WHERE. Может ли кто-нибудь объяснить, почему это происходит и что я могу сделать, чтобы исправить мою ситуацию?

Предположим, у меня есть формула, которую я назвал псевдонимом в части запроса SELECT. Как мне с этим справиться?

 ВЫБЕРИТЕ *,
( 6371 * 1000 * acos ( cos ( радианы (42,3936868308) ) * cos ( радианы ( lat )) * cos ( радианы ( lon ) - радианы (-72,5277256966 )) + sin ( радианы (42,3936868308 )) * sin ( радианы ( lat )))
AS расстояние
ОТ poi_table
ГДЕ расстояние < 500;
 
  • sql
  • sql-server
  • tsql

SQL обычно не позволяет ссылаться на псевдонимы столбцов в предложениях WHERE, GROUP BY или HAVING. MySQL поддерживает ссылки на псевдонимы столбцов в GROUP BY и HAVING, но я подчеркиваю, что это вызовет проблемы при переносе таких запросов в другие базы данных.

В случае сомнений используйте фактическое имя столбца:

 ВЫБЕРИТЕ t.lat AS широта
  ОТ poi_table t
 ГДЕ т.лат < 500
 

Я добавил псевдоним таблицы, чтобы было проще увидеть, что является фактическим столбцом, а что псевдонимом.

Обновление


Вычисляемый столбец, подобный тому, который вы видите здесь:

 SELECT *,
       ( 6371 * 1000 * acos ( cos ( радианы (42,3936868308)) * cos ( радианы ( lat )) * cos ( радианы ( lon ) - радианы (-72,5277256966 )) + sin ( радианы (42,3936868308 )) * sin ( радианы ( lat ))) Расстояние AS
  ОТ poi_table
 ГДЕ расстояние < 500;
 

... не меняет того факта, что вы не можете ссылаться на псевдоним столбца в предложении WHERE. Чтобы этот запрос работал, вам нужно использовать:

 SELECT *,
       ( 6371 * 1000 * acos ( cos ( радианы (42,3936868308)) * cos ( радианы ( lat )) * cos ( радианы ( lon ) - радианы (-72,5277256966 )) + sin ( радианы (42,3936868308 )) * sin ( радианы ( lat ))) Расстояние AS
  ОТ poi_table
 ГДЕ ( 6371 * 1000 * acos ( cos ( радианы (42,3936868308)) * cos ( радианы ( lat )) * cos ( радианы ( lon ) - радианы (-72,52772569)66) ) + sin( радианы(42. 3936868308) ) * sin( радианы(лат) ) ) ) < 500;
 

Имейте в виду, что использование функции для столбца (IE: RADIANS(lat) ) сделает индекс бесполезным, если он существует в столбце.

2

SQL Server настроен на применение фильтров перед применением псевдонимов (поскольку это обычно дает более быстрые результаты).
Вы можете сделать вложенный оператор выбора. Пример:

 ВЫБЕРИТЕ Широту ИЗ
(
    ВЫБЕРИТЕ Широту КАК Широту ИЗ poi_table
) А
ГДЕ Широта < 500
 

Я понимаю, что это может быть не то, что вы ищете, потому что это делает ваши запросы более многословными.
Более кратким подходом было бы создание представления, обертывающего вашу базовую таблицу:

 CREATE VIEW vPoi_Table AS
ВЫБЕРИТЕ Широту КАК Широту ИЗ poi_table
 

Тогда вы могли бы сказать:

 ВЫБРАТЬ Latitude FROM vPoi_Table WHERE Latitude < 500
 

1

Я не уверен, почему вы не можете использовать "lat", но если нужно, вы можете переименовать столбцы в производной таблице.

 выберите широту из (ВЫБЕРИТЕ широту КАК широту ИЗ POI_table) p, где широта < 500
 

Это будет работать на ваш отредактированный вопрос!

 SELECT * FROM (SELECT <Список_Колонок>,
( 6371 * 1000 * acos ( cos ( радианы (42,3936868308) ) * cos ( радианы ( lat )) * cos ( радианы ( lon ) - радианы (-72,5277256966 )) + sin ( радианы (42,3936868308 )) * sin ( радианы ( lat )))
AS расстояние
ОТ poi_table) TMP
ГДЕ расстояние < 500;
 

Порядок логической обработки оператора SELECT

Следующие шаги показывают порядок логической обработки или привязки
порядок для оператора SELECT. Этот порядок определяет, когда объекты
определенные на одном шаге, становятся доступными для предложений в последующих
шаги. Например, если обработчик запросов может выполнить привязку (доступ) к
таблицы или представления, определенные в предложении FROM, эти объекты и их
столбцы становятся доступными для всех последующих шагов. Наоборот,
поскольку предложение SELECT — это шаг 8, любые псевдонимы столбцов или производные
на столбцы, определенные в этом предложении, нельзя ссылаться в предыдущем
оговорки. Однако на них можно ссылаться в последующих пунктах, таких как
предложение ORDER BY. Обратите внимание, что фактическое физическое выполнение
оператор определяется обработчиком запросов, и порядок может варьироваться
из этого списка.

  1. ИЗ
  2. НА
  3. ПРИСОЕДИНЯЙТЕСЬ
  4. ГДЕ
  5. ГРУППА ПО
  6. С КУБОМ или С РУЛОНОМ
  7. ИМЕЮЩИЙ
  8. ВЫБЕРИТЕ
  9. ОТЛИЧНЫЙ
  10. ЗАКАЗАТЬ
  11. ТОП

Источник: http://msdn.microsoft.com/en-us/library/ms189499%28v=sql.110%29.aspx

И принятый ответ, и порядок логической обработки объясняют, почему вы не могли сделать то, что предложили .

Возможное решение:

  • использовать производную таблицу (cte/subquery)
  • использовать выражение в ГДЕ
  • создать представление/вычисляемый столбец

Из SQL Server 2008 вы можете использовать оператор APPLY в сочетании с конструктором с табличным значением :

 SELECT *, s. distance
ОТ poi_table
ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ (ЗНАЧЕНИЯ(6371*1000*acos(cos(радианы(42,3936868308))*cos(радианы(широта))*cos(радианы(долгота)-радианы(-72,5277256966))+sin(радианы(42,3936868308))*sin (радианы(широта))))) AS s(расстояние)
ГДЕ расстояние < 500;
 

LiveDemo

Я не уверен, почему вы не можете использовать "широту", но если необходимо, вы можете переименовать столбцы в производной таблице.

 выберите a.latitude из (SELECT lat AS latitude FROM poi_table) a где широта < 500
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

Оператор SELECT

в SQL Server

В SQL Server инструкция SELECT используется для извлечения данных строк/столбцов из одной или нескольких существующих таблиц. Он соответствует стандартам SQL (язык структурированных запросов).

Синтаксис:
 ВЫБЕРИТЕ столбец1, столбец2,... столбецN
ОТ имя_таблицы
 

Выбрать все столбцы

Оператор * представляет все столбцы таблицы. Таким образом, вам не нужно указывать имя каждого столбца в запросе SELECT, чтобы получить данные из всех столбцов.

 ВЫБЕРИТЕ * ОТ Сотрудника;
 

Приведенный выше запрос возвращает данные всех строк и столбцов из таблицы Employee , как показано ниже.

Выбор всех записей

Выберите данные определенных столбцов

Укажите имена столбцов в операторе SELECT, чтобы получить данные только из этих столбцов, как показано ниже.

 ВЫБЕРИТЕ EmpId, Имя, Фамилию ОТ Сотрудника;
 

Приведенный выше запрос отобразит следующий результат.

Псевдоним для столбцов и таблиц

Вы можете указать псевдоним для одного или нескольких столбцов в запросе SELECT. Псевдоним — это временное имя таблицы или столбца в запросе.

Преимущество псевдонима:

  • Псевдоним делает столбец более читаемым в результирующем наборе.
  • Псевдоним используется для присвоения небольшим, сокращенным и осмысленным именам таблицам в запросе, чтобы можно было легко ссылаться на таблицы при объединении нескольких таблиц.
  • Псевдоним помогает нам определить, какой столбец принадлежит какой таблице в случае получения данных из нескольких таблиц.

Следующий запрос указывает «Идентификатор сотрудника» для EmpId и Имя в качестве псевдонима для столбца Имя в запросе SELECT.
Укажите псевдоним в одинарных или двойных кавычках, если вы хотите, чтобы в нем был пробел или другая строка.

 SELECT EmpId "Идентификатор сотрудника", Имя КАК Имя ОТ Сотрудника;
 

Приведенный выше запрос отобразит следующий результат.

+ Оператор в операторе SELECT

Оператор + в MS SQL Server объединяет строковые значения или добавляет числовые значения.
Следующее объединяет два столбца varchar в результате.

 ВЫБЕРИТЕ EmpId, Имя + ' ' + Фамилия КАК "Полное имя"
ОТ Сотрудника;
 

Приведенный выше запрос отобразит следующий результат.

Следующее просто суммирует числа в запросе на выборку.

 ВЫБЕРИТЕ 10 + 15; --возвращает 25
ВЫБЕРИТЕ 10,5 + 15; -- возвращает 25,5 

ИЗ Пункт

Оператор SELECT должен содержать условие FROM. Предложение FROM используется для перечисления имен таблиц, из которых мы хотим выбрать данные, и указать соединения между этими таблицами.