Как да направя псевдоним на поле или колона в MySQL?

Опитвам се да направя нещо подобно. Но получавам грешка в неизвестна колона:

SELECT SUM(field1 + field2) AS col1, col1 + field3 AS col3 from core

По принцип искам просто да използвам псевдонима, за да не се налага да извършвам операциите, извършени по-рано. Възможно ли е това в mysql?


person user225269    schedule 21.05.2011    source източник
comment
печатна грешка, трябва да е col1   -  person user225269    schedule 21.05.2011
comment
защо ти си col1 в select, когато col1 вече е псевдоним   -  person diEcho    schedule 21.05.2011
comment
поле в таблицата с целочислен тип данни, field1 и field2, и псевдонимът col1 също са цели числа.   -  person user225269    schedule 21.05.2011
comment
какъв е проблема в SELECT SUM(field1 + field2 + field3) AS coll from core   -  person diEcho    schedule 21.05.2011
comment

Опитвах се да напиша функция, която да изчисли сумата от цифрите на число с помощта на рекурсия, но изходът е неправилен. Ето кода:

/*Write a function to calculate sum of digits of a  number using recursion*/
/*Author:Udit Gupta     Date:10/08/2011*/

#include<stdio.h>

int sum (int);

int main () {
    int n,s;

    printf ("Enter the number:");
    scanf ("%d",&n);

    s = sum (n);
    printf ("The sum of the digits of the number is %d",s);
}


int sum (int a) {
    int f;

    if (a == 0) {
         return f;
    }
    f = (a% 10) + sum (a/10);
}

Ето някои от изходните стойности:

 udit@udit-Dabba ~/Desktop/letusc/ch5/J $ ./a2.out
 Enter the number:123
 The sum of the digits of the number is 7

 udit@udit-Dabba ~/Desktop/letusc/ch5/J $ ./a2.out
 Enter the number:1234
 The sum of the digits of the number is 2919930

 udit@udit-Dabba ~/Desktop/letusc/ch5/J $ ./a2.out
 Enter the number:123456
 The sum of the digits of the number is 4620297

 udit@udit-Dabba ~/Desktop/letusc/ch5/J $ ./a2.out
 Enter the number:12345
 The sum of the digits of the number is 15  /*Only this one seems correct*/

Може ли някой да ми помогне да разбера защо това не работи правилно?

  -  person user225269    schedule 21.05.2011
comment
Мисля, че просто ще направя изчислението в php, ако това не е възможно. Благодаря на тези, които коментираха.   -  person user225269    schedule 21.05.2011


Отговори (7)


Помислете за използване на подзаявка, като:

SELECT col1
,      col1 + field3 AS col3 
FROM   (
       SELECT  field1 + field2 as col1
       ,       field3
       from    core
       ) as SubQueryAlias
person Andomar    schedule 21.05.2011

select @code:= SUM(field1 + field2), @code+1 from abc;

Но, моля, имайте предвид следното (от документи за MySQL 5.6):

Като общо правило, освен в операторите SET, никога не трябва да присвоявате стойност на потребителска променлива и да четете стойността в рамките на същия оператор. Например, за да увеличите променлива, това е добре:

SET @a = @a + 1;

За други оператори, като SELECT, може да получите резултатите, които очаквате, но това не е гарантирано. В следния израз може да си помислите, че MySQL първо ще оцени @a и след това ще направи присвояване второ:

SELECT @a, @a:=@a+1, ...;

Обаче редът на оценка за изрази, включващи потребителски променливи, е недефиниран.

Така че, използвайте на свой собствен риск.

person Ravi Parekh    schedule 21.05.2011
comment
Това е сладка синтактична захар. :-) - person Denis de Bernardy; 21.05.2011
comment
За съжаление, това работи брилянтно в заявка, но не и в изглед :( - person maxhugen; 29.04.2013
comment
@kenn Работи добре за мен, на Mysql! - person Mirage; 16.02.2015
comment
@Melvin RTFM dev.mysql.com/doc/refman/5.6 /en/user-variables.html ...редът на оценка за изрази, включващи потребителски променливи, е недефиниран. Всъщност получавам NULL с горната заявка. - person kenn; 18.02.2015
comment
@kenn, добавих предупреждението като редакция. Благодаря за вниманието, това може да ухапе хора, които не го знаят. - person insaner; 28.06.2016
comment
Това работи чудесно, когато тествам нещо просто, но когато го приложа към заявка, която използвам в производството, получавам ненадеждни резултати. Стойността на полето понякога ще бъде там и не там. - person rclai; 02.08.2017

Можете да select псевдонима:

SELECT SUM(field1 + field2) AS col1, (select col1) + field3 AS col3 from core

Това работи.

person Moises    schedule 16.04.2015
comment
Работи. Същият проблем и същото решение като този: stackoverflow .com/questions/2077475/ - person dxvargas; 19.10.2015
comment
това работи чудесно в mysql.. не съм сигурен за други dbs. трябва да е най-добрият отговор - person billynoah; 09.03.2016
comment
Това не работи (грешка „препратка към групова функция“), ако колоната, към която препращате, се изчислява въз основа на групова функция като в SELECT MAX(ID) AS c1, (SELECT c1) AS c2 FROM log GROUP BY ID – работи обаче, ако замените MAX(ID) с ID в този пример. - person Christopher K.; 06.06.2018
comment
@ChristopherK. е вярно. Попаднах и на това. Аз обаче дефинирах изглед, вместо просто да изпълнявам права заявка. Като такъв разреших това, като вложих един изглед в другия. Първият изглед използва агрегатните функции. Вторият (обвиващ изглед) извършва изчисления над този първи. Проблема решен. - person BuvinJ; 03.10.2018

Според спецификацията отговорът на Ravi Parekh не е гарантиран винаги да работи, тъй като "редът на оценка за изрази, включващи потребителски променливи, е недефиниран".

Намерих този отговор, след като се опитах да използвам променлива и получих странни резултати.

person mmavcy    schedule 23.07.2014

select @code:= SUM(field1 + field2), (@code*1) from abc;

@code*1 скрит в цифров израз и можете да използвате навсякъде като

select @code:= SUM(field1 + field2), (@code*1)+field3 from abc;
person Kamran Aslam    schedule 22.12.2014
comment
Дойдох тук, за да гласувам за теб, това работи перфектно в нашия сценарий. Заменен @code с по-удобна за унгарски/код стил променлива и запазен AS. @fVariable:=SUM(column) AS alias (псевдонимът трябва да бъде ограден с обратни отметки, SO не ги изобразява правилно. - person ReSpawN; 07.06.2016
comment
@ReSpawN Това е недефинирано поведение. Случи се да ви даде отговора, който очаквахте този път. Тъй като е с отворен код, определени употреби за четене + запис са безопасни за конкретна компилация (ако не смятате, че това е противоречие), ако проверите кода. - person philipxy; 16.08.2017

Краткият отговор е не:

mysql> select 1 as a, a + 1 as b;
ERROR 1054 (42S22): Unknown column 'a' in 'field list'

postgresql# select 1 as a, a + 1 as b;
ERROR:  column "a" does not exist

Въпреки това някои реализации на SQL позволяват използването на псевдоними в клаузи where/group by/having, напр.:

postgresql# select 1 as a group by a; -- 1 row
person Denis de Bernardy    schedule 21.05.2011

В случай, че го използвате с агрегатна функция (групиране по) и ако не работи за вас, поставете изчислената колона до края с препратка към колона напред.

SELECT FNC2(AF), FNC1(A) AS AF,  B, C,  FROM Table GROUP BY ...

1st one doesn't work due to forward column referencing. Do this instead 

SELECT FNC1(A) AS AF, B, C, FNC2((SELECT AF)) FROM Table GROUP BY ...

person ship shuk - www.shipshuk.com    schedule 09.01.2019