2010-01-16 4 views
42

Pourquoi cette requête ne fonctionne-t-elle pas?Utilisation d'un alias dans les calculs SQL

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"

Ceci est une version simplifiée de ce que j'essaie de faire, mais fondamentalement, je voudrais utiliser un alias pour faire d'autres calculs. Mes calculs sont beaucoup plus compliqués et c'est pourquoi il serait bien de l'alias puisque je le répète plusieurs fois de différentes façons.

+0

Vous devriez vraiment la caisse zessx de réponse - il fait exactement ce dont vous avez besoin sans la sous-requête que la réponse acceptée actuelle a. –

Répondre

102

Enroulez votre alias réutilisé avec (SELECT alias):

SELECT 10 AS my_num, 
     (SELECT my_num) * 5 AS another_number 
FROM table 
+9

Ceci est incroyable et devrait être la réponse acceptée. Merci beaucoup. –

+11

Je me demande où cette fonctionnalité est documentée. J'ai cherché dans toute la documentation de MySQL et je ne l'ai pas trouvé. Je ne sais pas comment cela fonctionne "alias réutilisation" et je suis curieux de la portabilité ou de l'impact sur les performances. Si quelqu'un en sait plus à ce sujet, j'apprécierai un lien. Merci. –

+0

cela vient de faire ma semaine .. peut-être mois. super utile surtout avec des alias construits à partir d'instructions de contrôle de flux comme 'IF()', 'CASE()', etc – billynoah

10

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

SELECT my_num*5 AS another_number FROM 
(
    SELECT 10 AS my_num FROM table 
) x 
+0

A quoi sert le "x"? – mysmallidea

+0

@RyanHeneise, c'est un alias de sous-sélection; de cette façon, vous pouvez aller avec 'x.my_num' –

4

alias dans SQL ne sont pas comme variables dans un langage de programmation. Les alias ne peuvent être référencés à nouveau qu'à certains points (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 toutes les colonnes calculées.

Ou vous pouvez utiliser un 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 crois que ce sera un peu plus rapide que d'utiliser une requête dérivée mais cela dépend probablement beaucoup sur 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"; 
0

`` 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 
+0

Notez que 'CROSS APPLY' ne semble pas être disponible dans MySQL * (encore) *. – Pang