[英]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.