MySQL объединяет все столбцы

Почему мы не можем объединиться в MySQL с помощью ключевого слова *

SELECT concat(*) FROM table

или

SELECT group_concat(*) FROM table

Есть ли другой способ доступа к значениям в столбце без явного использования имени столбцов?

Ответ 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;

Смотрите здесь скрипку здесь.