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. Обратите внимание, что фактическое физическое выполнение
оператор определяется обработчиком запросов, и порядок может варьироваться
из этого списка.
- ИЗ
- НА
- ПРИСОЕДИНЯЙТЕСЬ
- ГДЕ
- ГРУППА ПО
- С КУБОМ или С РУЛОНОМ
- ИМЕЮЩИЙ
- ВЫБЕРИТЕ
- ОТЛИЧНЫЙ
- ЗАКАЗАТЬ
- ТОП
Источник: 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 используется для перечисления имен таблиц, из которых мы хотим выбрать данные, и указать соединения между этими таблицами.