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 查询的结果

mysql 模糊查询 concat()

在 JOIN 查询中使用 Mysql GROUP_CONCAT

在 php codeigniter 中使用 join/concat 的 mysql 查询结果

mysql concat函数进行模糊查询

如何在 mysql 的 Group_concat 子查询中使用选择查询