MySQL连接所有列

21

为什么MySQL中不能使用*关键字进行拼接?

SELECT concat(*) FROM table
或者
SELECT group_concat(*) FROM table

除了显式地使用列名,我们还有其他方法可以访问列中的值吗?


3
这种功能有什么实际用途? - Mike Brant
2
你可以查询 information_schema.columns 以获取列的列表,并将它们自己插入到查询中。 - Gordon Linoff
好的,假设我有100个列,并且想要将它们全部选择并连接到一个由逗号分隔的字符串中。手动输入100个列名会非常麻烦。但是为什么第一次使用*关键字呢? - Blub
1
为什么不直接将行作为数组获取到您的应用程序中,然后将该数组合并成逗号分隔的字符串呢? - Bill Karwin
1
一个实际的用途是在单个查询上运行多个SELECT,当结果具有不同的格式或列数时。列可以连接成一个单一的列,然后通过UNION将行放在一起。这可能会减少对mysql服务器的调用次数。 - Henry
显示剩余2条评论
1个回答

46
为了将表中的所有列连接起来,您不能使用 * 关键字,但需要显式列出所有列:
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;

请查看 fiddle here

你真的帮了我大忙!非常感谢你! - Nicola Bernardi
也许我们可以将PREPARE与SHOW columns FROM your-table;结合起来? - Danny Holstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接