Использование псевдонима в вычислениях SQL
Почему этот запрос не работает?
SELECT 10 AS my_num, my_num*5 AS another_number
FROM table
В этом примере я пытаюсь использовать псевдоним my_num в других вычислениях. Это приводит к неизвестному столбцу "my_num"
Это упрощенная версия того, что я пытаюсь сделать, но в основном я хотел бы использовать псевдоним для других вычислений. Мои расчеты намного сложнее, и поэтому было бы неплохо использовать псевдонимы, поскольку я повторяю их несколько раз по-разному.
5 ответов
Просто оберните ваш повторно использованный псевдоним (SELECT alias)
:
SELECT 10 AS my_num,
(SELECT my_num) * 5 AS another_number
FROM table
Вы должны будете использовать подвыбор, чтобы использовать эти псевдонимы таким образом
SELECT my_num*5 AS another_number FROM
(
SELECT 10 AS my_num FROM table
) x
Псевдонимы в SQL не похожи на переменные в языке программирования. На псевдонимы можно ссылаться снова только в определенных точках (особенно в GROUP BY
а также HAVING
положения). Но вы не можете повторно использовать псевдоним в SELECT
пункт. Таким образом, вы можете использовать производный запрос (например, предложенный Rubens Farias), который позволяет вам переименовывать столбцы и / или называть любые вычисляемые столбцы.
Или вы могли бы использовать VIEW
если ваши формулы, как правило, являются фиксированными
CREATE VIEW table10 AS SELECT 10 AS my_num FROM table;
SELECT my_num * 5 AS another_number FROM table10;
Я считаю, что это будет немного быстрее, чем использование производного запроса, но это, вероятно, во многом зависит от вашего реального запроса.
Или вы можете просто дублировать работу:
SELECT 10 AS my_num, 10 * 5 AS another_number FROM table;
Что может быть удобно в чем-то вроде php/perl:
my $my_num = 10;
my $query = "SELECT $my_num AS my_num, $my_num * 5 AS another_number FROM table";
``Другой вариант - использовать оператор APPLY.
SELECT my_num, my_num*5 AS another_number
FROM table
CROSS APPLY
(SELECT 5 AS my_num) X
Очень просто. Вы можете использовать переменные.
SELECT @my_num := 10 AS my_num, @my_num*5 AS another_number;
SHOW WARNINGS;
При этом появится предупреждение: «Установка пользовательских переменных в выражениях устарела и будет удалена в будущем выпуске. Рассмотрите альтернативы: «SET переменная = выражение, ...» или «SELECT выражение(я) INTO переменные(я)». ."