繁体   English   中英

MySQL:如何用 AS 连接列名?

[英]MySQL: How do you concat a column name with AS?

我正在尝试获取它,以便我可以在列名中使用变量,但它似乎不起作用。

select 
    v.name as concat(@person,'\'s Vendor')
    ,sum(t.amount) as 'Total' 
from 
    total t 
inner join vendor v 
    on v.d = t.d 
where 
    t.who = @person 
    and v.name is not null 
    and t.sub_cat not like 'Payment' 
    and year(date) = (year(sysdate())-1) 
    and amount > 0 
group by 
    v.name 
order by 
    sum(amount) 
desc limit 20;

上面抛出错误但下面有效。

select 
    v.name as 'John\'s Vendor'
    ,sum(t.amount) as 'Total' 
from 
    total t 
inner join vendor v 
    on v.d = t.d 
where 
    t.who = @person 
    and v.name is not null 
    and t.sub_cat not like 'Payment' 
    and year(date) = (year(sysdate())-1) 
    and amount > 0 
group by 
    v.name 
order by 
    sum(amount) 
desc limit 20;

基本上,我希望能够添加 person 变量和一些更多的文本作为列名称,以更好地识别数据的用途,在本例中,即数据是关于谁的。 另外,我想将其用作存储过程:

create procedure GetTotals(IN person varchar(10));
delimiter //
begin
    above working code
end //
delimiter ;

您可以为此类查询使用动态 sql

SET @sql = CONCAT("select 
    v.name as '",@person,
    "\\'s Vendor'
    ,sum(t.amount) as 'Total' 
from 
    total t 
inner join vendor v 
    on v.d = t.d 
where 
    t.who = @person 
    and v.name is not null 
    and t.sub_cat not like 'Payment' 
    and year(date) = (year(sysdate())-1) 
    and amount > 0 
group by 
    v.name 
order by 
    sum(amount) 
desc limit 20;");
PREPARE stmt FROM @sql;
EXECUTE stmt;    
DEALLOCATE PREPARE stmt; 

请记住,这可以用于 sql 注入,因此该名称的白名单是有序的

为什么不直接将参数添加为具有固定列名的自己的列。 您的退货流程将负责展示,并且可以只使用该额外的列作为“谁”的目的。 前任:

select 
      v.name,
      sum(t.amount) as 'Total',
      concat(@person,'\'s Vendor') as ForWho
   from 

是的,每一行都会在 ForWho 列中返回 ex: "John's Vendor" 的结果,但至少您不必在返回集中设置格式,因为您有该列。

标识符(包括别名)必须在解析查询时固定。 您不能创建依赖于表达式的别名。

您可以通过使用@person变量格式化 SQL 语句来进行动态 SQL 查询:

SET @sql = CONCAT(
 'select v.name as `', concat(@person,'\'s Vendor'), '`,',
 ...
 ' where t.who = ? ',
 ...
);
PREPARE stmt FROM @sql;
EXECUTE stmt USING @person;
DEALLOCATE PREPARE stmt;

@person的值可以设置为参数,其中? 占位符出现在准备好的查询语法中。 但是不能参数化列别名中的用法。 所以你只需要注意 @person 的值在那个@person中是安全的。

您应该像任何其他标识符一样用反引号分隔别名,以防止在@person包含空格或标点字符时出现语法错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM