web-dev-qa-db-fra.com

Utilisation d'un alias dans les calculs SQL

Pourquoi cette requête ne fonctionne-t-elle pas?

SELECT 10 AS my_num, my_num*5 AS another_number
FROM table

Dans cet exemple, j'essaie d'utiliser l'alias my_num dans d'autres calculs. Il en résulte une colonne inconnue "my_num"

C’est une version simplifiée de ce que j’essaie de faire, mais j’aimerais utiliser un alias pour effectuer d’autres calculs. Mes calculs sont beaucoup plus compliqués et c'est pourquoi il serait agréable de le nommer puisque je le répète plusieurs fois.

50
Tom Rossi

Enveloppez simplement votre alias réutilisé avec (SELECT alias):

SELECT 10 AS my_num, 
       (SELECT my_num) * 5 AS another_number
FROM table
123
zessx

Vous aurez besoin d'utiliser un sous-choix pour utiliser cet alias de cette façon

SELECT my_num*5 AS another_number FROM
(
    SELECT 10 AS my_num FROM table
) x
10
Rubens Farias

Les alias dans SQL ne sont pas comme des variables dans un langage de programmation. Les alias ne peuvent être référencés à nouveau qu'à certains moments (en particulier dans les clauses GROUP BY et HAVING). Mais vous ne pouvez pas réutiliser un alias dans la clause SELECT. Vous pouvez donc utiliser une requête dérivée (telle que suggérée par Rubens Farias ) qui vous permet de renommer vos colonnes et/ou de nommer les colonnes calculées.

Ou vous pouvez utiliser une VIEW si vos formules sont généralement fixes

CREATE VIEW table10 AS SELECT 10 AS my_num FROM table;
SELECT my_num * 5 AS another_number FROM table10;

Je pense que cela sera légèrement plus rapide que d’utiliser une requête dérivée, mais cela dépend probablement beaucoup de votre requête réelle.

Ou vous pouvez simplement dupliquer le travail:

SELECT 10 AS my_num, 10 * 5 AS another_number FROM table;

Ce qui pourrait être pratique dans quelque chose comme php/perl:

my $my_num = 10;
my $query = "SELECT $my_num AS my_num, $my_num * 5 AS another_number FROM table";
5
Rob Van Dam

`` Une autre option consiste à utiliser l'opérateur APPLY

SELECT my_num, my_num*5 AS another_number
FROM table
CROSS APPLY 
(SELECT 5 AS my_num) X