一尘不染

MySQL连接所有列

mysql

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

SELECT concat(*) FROM table

要么

SELECT group_concat(*) FROM table

还有其他方法可以访问列中的值而无需显式使用列名吗?


阅读 411

收藏
2020-05-17

共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;

请看这里的小提琴。

2020-05-17