Использование псевдонима в вычислениях 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 переменные(я)». ."

Другие вопросы по тегам