MySQL concat() 创建要在查询中使用的列名?
Posted
技术标签:
【中文标题】MySQL concat() 创建要在查询中使用的列名?【英文标题】:MySQL concat() to create column names to be used in a query? 【发布时间】:2010-11-02 10:03:22 【问题描述】:我想连接列名,使列名的第一部分是字符串,第二部分是另一个查询的结果。
例如:
SELECT CONCAT('column', mytable.mycolumn) FROM table ...
这可以通过某种方式完成吗?这样它不会给我错误,但我没有得到预期的结果,而且连接似乎不起作用。
【问题讨论】:
我认为...您可以在 CONCAT 中使用另一个 SELECT,否则您将不得不创建一个存储过程。这里没有要测试的 mysql,所以请评论而不是回答。 【参考方案1】:我之前说过不能这样做,但我错了。最后我自己也需要这样的东西,所以我环顾四周,发现 server-side prepared statements 可以让你从字符串构建和执行任意 SQL 语句。
这是我刚刚做的一个例子来证明这个概念:
set @query := (
select concat(
"select",
group_concat(concat("\n 1 as ", column_name) separator ','),
"\nfrom dual")
from information_schema.columns
where table_name = 'columns')
;
prepare s1 from @query
;
execute s1
;
deallocate prepare s1
;
【讨论】:
我认为是这样,我必须接受我不能在一个查询中做我想做的事,尽管它本来应该很好。 @tharkun 我已经推翻了我的答案。请注意,根据文档,此功能至少需要 MySQL 5.0 版本。【参考方案2】:如果列数是固定的,那么非动态方法可能是:
select
case mytable.mycolumn
when 1 then column1 -- or: when 'a' then columna
when 2 then column2
when ...
else ...
end as my_semi_dynamic_column
from ...
【讨论】:
感谢您的想法。它不起作用,因为它必须是完全通用的。 再次阅读您的问题,我看到您使用的是数字。所以,我将“当'a'然后column”更改为“when 1 then column1”。你的表中'columnxx'列的数量真的那么高吗...? 是的,它非常高,而且会发生变化。所以我需要一些动态和通用的东西。 非常有用的提示,您只是忘记在“as”指令之前添加“end”。谢谢! 感谢并修复,@Lionel。【参考方案3】:我不相信你可以用 CONCAT()
和 CONCAT_WS()
做到这一点。我建议使用您正在使用的语言来创建字段名称。这样做会非常可怕,具体取决于数据库中的数据来自何处。
【讨论】:
你能详细说明一下可怕吗?要连接的数据是一个 auto_incremented ID(主要)。 请修改您的问题。如果您使用的数字是 auto_incremented ID,那么您希望表中有多少列?我想我不明白这个问题,因为我希望这个表没有像“column1”,“column2,...,“column90000”,...这样的列 有点但不是真的。这些列是单个问题的结果,每行一个用户。所以这是一个问卷结果的结果集。每个问题都有一个 id,并且该 id 包含在列名中。 如果现在更改数据库设计还不算太晚,那么我会这样做...现在:仅使用“select *”并在其他地方解析结果怎么样? 您的动态表定义(以及无限数量的表)难道不会让您的应用程序的未来升级(或更糟:升级的回滚......)也很麻烦吗?【参考方案4】:我建议查看information_schema。以下代码未经测试,但理论上应该可以工作。显然用适当的表名替换您的表名或链接到 information_schema.tables 并在 where 子句中使用 table_type
select concat('column', column_name) from information_schema.columns where table_name ='your table name'
【讨论】:
如果在 information_schema 中的选择不起作用,为什么它应该起作用? 这会获取列名,而不是列的内容(名称是动态的)。 Ehhh,但您想选择列 VALUES,对吧?不是名字?我认为以上内容不会帮助您从动态列名中进行选择。选择列名(不选择)不需要任何火箭科学 - 实际上已经在您在问题中发布的示例中完成。 SELECT col.COLUMN_NAME
FROM information_schema
.COLUMNS
AS col WHERE col.TABLE_NAME
LIKE 'mytable' AND col.COLUMN_NAME
= CONCAT('column', 35)
但生成的列名不被接受为列名。和以前一样的问题。以上是关于MySQL concat() 创建要在查询中使用的列名?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 group_concat 和左连接计算 mysql 查询的结果
在 JOIN 查询中使用 Mysql GROUP_CONCAT