2014-04-28 54 views
12

爲什麼我們不能在MySQL中使用*關鍵字連接?MySQL連接所有列

SELECT concat(*) FROM table 

SELECT group_concat(*) FROM table 

有沒有其他的辦法,我們可以在一列訪問值,而無需顯式使用的列名?

+3

這種功能的實際用途是什麼? –

+2

您可以查詢'information_schema.columns'以獲取列的列表並將它們自己插入到查詢中。 –

+0

好吧,假設我有100列,並希望將它們全部連接到由逗號分隔的字符串。手動輸入100個列名是相當繁重的工作。但是,爲什麼在那裏首先有*關鍵字呢? – Blub

回答

19

要連接的所有表中的列,你不能使用*關鍵字,但你需要明確列出所有列:

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`,... 

所以現在我們有所有元素來創建我們的查詢dinamically:

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