2009-06-12 3 views
10

Vorrei concatenare i nomi delle colonne in modo che la prima parte del nome della colonna sia una stringa e la seconda parte sia un numero che è il risultato di un'altra query.MySQL concat() per creare nomi di colonne da utilizzare in una query?

Ad esempio:

SELECT CONCAT('column', mytable.mycolumn) FROM table ... 

questo può essere fatto in qualche modo. In questo modo non mi dà errori ma non ottengo il risultato atteso e sembra che la concatenazione non funzioni.

+0

penso ... è possibile utilizzare un altro SELEZIONA all'interno della CONCAT , se no, dovrai creare una stored procedure. Non ho qui un MysQL da testare, quindi commenta invece di rispondere. – TimothyP

risposta

22

ho già detto che questo non poteva essere fatto, ma mi sbagliavo. Alla fine ho avuto bisogno di qualcosa del genere, quindi mi sono guardato intorno e ho scoperto che server-side prepared statements consente di creare ed eseguire istruzioni SQL arbitrarie dalle stringhe.

Ecco un esempio che ho appena fatto per dimostrare il concetto:

set @query := (
    select concat(
    "select", 
     group_concat(concat("\n 1 as ", column_name) separator ','), 
    "\nfrom dual") 
    from information_schema.columns 
    where table_name = 'columns') 
; 
prepare s1 from @query 
; 
execute s1 
; 
deallocate prepare s1 
; 
+0

Penso che sia il caso e devo accettare che non posso fare quello che voglio in una query, bello come sarebbe stato. – markus

+0

@tharkun Ho invertito la mia risposta. Si noti che, secondo la documentazione, questa funzione richiede almeno la versione 5.0 di MySQL. –

2

Non credo che si possa fare questo con CONCAT() e CONCAT_WS(). Consiglierei di usare la lingua che stai lavorando con la creazione dei nomi dei campi. Farlo in questo modo sarebbe piuttosto spaventoso, a seconda di dove provenivano i dati nel database.

+0

potresti elaborare su spaventoso? i dati da concatenare sono un ID autoincrementato (primario). – markus

+0

Per favore rivedi la tua domanda. Se il numero che stai utilizzando è un ID autoincrementato, quante colonne ti aspetti di avere nella tua tabella? Immagino di non capire la domanda, come spero che questa tabella non abbia colonne come "column1", "column2, ...," column90000 ", ... – Arjan

+0

tipo di ma non proprio. singole domande, un utente per riga, quindi è un insieme di risultati del questionario, ogni domanda ha un id e quell'identità è inclusa nel nome della colonna – markus

12

Se è fissato il numero di colonne, quindi un approccio non-dinamica potrebbe essere:

select 
    case mytable.mycolumn 
    when 1 then column1 -- or: when 'a' then columna 
    when 2 then column2 
    when ... 
    else ... 
    end as my_semi_dynamic_column 
from ... 
+0

grazie per l'idea. non funzionerà perché deve essere completamente generico. – markus

+0

Leggendo di nuovo la tua domanda, vedo che stai usando i numeri. Così, ho cambiato il "quando" e "poi columna" in "quando 1 poi la colonna 1". Il numero delle colonne "columnxx" nella tua tabella è davvero così alto ...? – Arjan

+0

sì, è piuttosto alto e cambia.quindi ho bisogno di qualcosa di dinamico e generico. – markus

0

vorrei suggerire guardando information_schema. Il seguente codice non è stato verificato ma dovrebbe funzionare teoricamente. Ovviamente sostituire il nome della tabella con un nome tabella appropriata o un collegamento a INFORMATION_SCHEMA.TABLES e utilizzare il TABLE_TYPE in cui la clausola

select concat('column', column_name) from information_schema.columns where table_name ='your table name' 
+0

perché dovrebbe funzionare per la selezione in information_schema se non funziona diversamente? – markus

+0

Questo recupera i nomi delle colonne, non i contenuti della colonna (il cui nome è dinamico). – Arjan

+0

sì, ha senso, grazie per il suggerimento! Lo sto già provando ora ... – markus

-1

Si può facilmente utilizzare seguente query:

SELECT group_concat(COLUMN_NAME) FROM information_schema.columns WHERE table_name ='your table name';