2010-12-13 22 views
18

è possibile selezionare il campo il cui nome è stringa?nome campo mysql dalla variabile

SELECT 'fieldname' FROM table

ho bisogno di questo per trigger per avere i nomi dei campi dinamici qualcosa come

SET fieldname = NEW.`name`; 
UPDATE table SET fieldname = 1 ; 
+3

Non capisco cosa vuoi dire –

+0

Come stai eseguendo l'sql? Leggi su SQL dinamico. –

+0

Un campo con il nome "stringa"? 'SELECT \' string \ 'FROM \' table \ ''? – jwueller

risposta

18

Se la stringa è nel vostro programma esterno (come PHP), certo, basta creare l'istruzione MySQL.

Se la stringa si trova in una tabella MySQL, non è possibile. MySQL non ha alcuna funzione eval() o simile. È impossibile:

Supponiamo di avere una tabella 'query' con un campo "nome colonna" che si riferisce a uno dei nomi di colonna nella tabella "mytable". Ci potrebbero essere ulteriori colonne in 'query' che consentono di selezionare la columnname si desidera ...

INSERT INTO queries (columname) VALUES ("name") 
SELECT (select columnname from queries) from mytable 

Si può comunque lavorare con PREPARED STATEMENTS. Essere consapevoli che questo è molto hacky.

SELECT columnname from queries into @colname; 
SET @table = 'mytable'; 
SET @s = CONCAT('SELECT ',@colname,' FROM ', @table); 

PREPARE stmt FROM @s; 
EXECUTE stmt; 
+4

le istruzioni preparate non sono consentite nei trigger ... – samrockon

+1

Probabilmente un po 'tardi alla festa, ma che diavolo ... Dici che questo comportamento è molto hacky. Ma potresti forse spiegare perché è così? Perché questa soluzione mi aiuta molto, ma non voglio dipendere da una soluzione instabile. – mahulst

+1

Il codice è hacky perché non sta utilizzando funzionalità SQL semplici (perché queste funzionalità non esistono). Ma non preoccuparti, è stabile e non ti spezzerà. Fino a dieci minuti fa, lo sto usando in produzione! – dotancohen

0

Se si desidera selezionare più di una colonna:

SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.`COLUMNS` C 
WHERE table_name = 'MyTb' AND COLUMN_NAME LIKE '%whatever%' INTO @COLUMNS; 

SET @table = 'MyTb'; 
SET @s = CONCAT('SELECT ',@columns,' FROM ', @table); 

PREPARE stmt FROM @s; 
EXECUTE stmt;