【问题标题】:MySQL concatenating all columnsMySQL连接所有列
【发布时间】:2014-04-28 18:06:23
【问题描述】:

为什么我们不能在 MySQL 中使用 * 关键字连接?

SELECT concat(*) FROM table

SELECT group_concat(*) FROM table

有没有其他方法可以在不显式使用列名的情况下访问列中的值?

【问题讨论】:

  • 这种功能的实际用途是什么?
  • 您可以查询information_schema.columns获取列列表并自己插入到查询中。
  • 好吧,假设我有 100 列,并希望将它们全部连接到以逗号分隔的字符串。手动输入 100 个列名将是相当多的工作。但是为什么首先会有 * 关键字呢?
  • 为什么不直接将行作为数组提取到您的应用程序中,然后将数组内爆成逗号分隔的字符串?
  • 当结果具有不同的格式或 nr 个列时,实际用途是在单个查询上运行多个 SELECT。列可以连接成一个,然后可以通过 UNION 将行放在一起。可以减少对 mysql 服务器的调用次数。

标签: mysql database


【解决方案1】:

要连接表中的所有列,不能使用* 关键字,但需要显式列出所有列:

SELECT CONCAT(col1, col2, col3, ....)
FROM yourtable

或者您可能想使用CONCAT_WS 来跳过空值:

SELECT CONCAT_WS(',', col1, col2, col3, ....)
FROM yourtable

如果您不想手动指定所有列名,您可以使用动态查询。此查询将返回您的表的所有列名:

SELECT `column_name` 
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`='yourtable';

使用 GROUP_CONCAT,您可以获得所有列名的列表:

GROUP_CONCAT(CONCAT('`', column_name, '`'))

引用,以逗号分隔的格式:

`col1`,`col2`,`col3`,`col4`,...

所以现在我们拥有了动态创建查询的所有元素:

SELECT
  CONCAT(
    'SELECT CONCAT_WS(\'\',',
    GROUP_CONCAT(CONCAT('`', column_name, '`') ORDER BY column_name),
    ') AS all_columns FROM yourtable;')
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`='yourtable'
INTO @sql;

此查询会将@sql 字符串设置为:

SELECT CONCAT_WS('', col1, col2, col3, ....) AS all_columns FROM yourtable

这段代码将执行它:

PREPARE stmt FROM @sql;
EXECUTE stmt;

请看小提琴here

【讨论】:

  • 你真的治愈了我!非常感谢!
  • 嗯,也许我们可以将 PREPARE 与 SHOW columns FROM your-table 结合起来;?
猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 2011-01-16
  • 2022-01-25
  • 2012-05-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
相关资源
最近更新 更多