串联如何在MySQL存储过程中工作?

时间:2014-05-16 04:54:15

标签: mysql stored-procedures concatenation

嗨,这是我试图在MySQL中执行的示例查询。它在使用concat函数时发出错误

  SELECT @grp :=San_Orange_CS_GRP as santoor_grp ,
  @_11:=power(@grp,0.1)+0.1*@_11 AS concat "@grp" , "_11" ,
  @_12:=power(@grp,0.2)+0.1*@_12 AS concat "@grp" , "_12" 
  FROM DUMMY JOIN (SELECT @_11:=0,@_12:=0) t;

当我在AS语句之后每次更改代码并在查询中给出列名时,它工作正常。但问题是我有大约100列,所以我不能继续写每个名字,每次我运行不同的市场grp

   SELECT @grp :=Orange_CS_GRP as Orange_CS_grp ,
   @_11:=power(@grp,0.1)+0.1*@_11 Orange_CS_GRP_11 ,
   @_12:=power(@grp,0.2)+0.1*@_12 AS Orange_CS_GRP_12 
   from DUMMY JOIN (SELECT @_11:=0,@_12:=0) t;

提前致谢: - )

2 个答案:

答案 0 :(得分:0)

这是concat的确切查询:

SELECT @grp:= San_Orange_CS_GRP as santoor_grp,   @ _11:= power(@ grp,0.1)+0.1 * @ _ 11 AS concat(@grp," _11"),   @ _12:= power(@ grp,0.2)+0.1 * @ _ 12 AS concat(@grp," _12")   FROM DUMMY JOIN(SELECT @ _11:= 0,@ _ 12:= 0)t;

在查询中使用concat是不正确的。

由于

答案 1 :(得分:0)

别名是标识符,无法动态地为列的值分配名称。

为此,您可以使用存储过程。

示例

drop procedure if exists sp_so_q23692874;

delimiter //

create procedure sp_so_q23692874()
begin
  -- read my comment below this SP.
  SELECT San_Orange_CS_GRP INTO @grp FROM DUMMY LIMIT 1;
  set @grp_name := 'Orange_CS_GRP';

  set @sql := concat( 'SELECT San_Orange_CS_GRP as santoor_grp ' );
  set @sql := concat( @sql, ', @_11 := power( ', @grp, ', 0.1 ) + 0.1 * @_11 ' );
  set @sql := concat( @sql, 'AS `', @grp_name, '_11` ' );
  set @sql := concat( @sql, ', @_12 := power( ', @grp, ', 0.2 ) + 0.1 * @_12 ' );
  set @sql := concat( @sql, 'AS `', @grp_name, '_12` ' ); 
  set @sql := concat( @sql, ' FROM DUMMY JOIN ( SELECT @_11 := 0, @_12 := 0 ) t' );

  prepare stmt from @sql;
  execute stmt;
  drop prepare stmt;
end;
//

delimiter ;

call sp_so_q23692874();
-- select @sql;

我不确定你将如何使用它,因为如果结果集只有一行,在表达式名称上有一个动态别名可能会很好。你不能为每一行上的表达式赋一个新名称,这也没有意义。这就是我在LIMIT结果集上放置grp子句的原因。