2014-04-28 17 views
12

Dlaczego nie możemy łączyć się w MySQL przy użyciu słowa kluczowego *?MySQL łączące wszystkie kolumny

SELECT concat(*) FROM table 

lub

SELECT group_concat(*) FROM table 

Czy istnieje inny sposób możemy uzyskać dostęp do wartości w kolumnie bez jawnie przy użyciu nazwy kolumn?

+3

Jakie byłoby praktyczne zastosowanie dla takiej funkcjonalności? –

+2

Możesz wysłać zapytanie 'information_schema.columns', aby uzyskać listę kolumn i wstawić je do zapytania samodzielnie. –

+0

Cóż, powiedzmy, że mam 100 kolumn i chciałbym wybrać je wszystkie połączone z łańcuchem oddzielonym przecinkami. Byłoby trochę pracy, aby ręcznie wprowadzić 100 nazw kolumn. Ale dlaczego także słowo kluczowe * pojawia się w pierwszej kolejności? – Blub

Odpowiedz

19

Aby złączyć wszystkie kolumny w tabeli, nie można użyć słowa kluczowego *, ale trzeba wyraźnie wymienić wszystkie kolumny:

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

lub może chcesz używać CONCAT_WS że pominie wartości null:

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

Jeśli nie chcesz podawać wszystkich nazw kolumn ręcznie, możesz użyć zapytania dinamicznego. To zapytanie zwróci wszystkie nazwy kolumn z tabeli:

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

i korzystania GROUP_CONCAT można uzyskać listę wszystkich nazw kolumn:

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

cytowany w oddzielonych przecinkami format:

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

, więc teraz mamy wszystkie elementy, aby utworzyć naszą kwerendę dinamicznie:

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; 

ta kwerenda będzie ustawić @sql ciąg coś takiego:

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

i kod ten będzie go wykonać:

PREPARE stmt FROM @sql; 
EXECUTE stmt; 

proszę zobaczyć skrzypce here.