2010-12-13 22 views
18

¿es posible seleccionar el campo cuyo nombre es una cadena?nombre del campo mysql de la variable

SELECT 'fieldname' FROM table

necesito esto para disparador de tener nombres de campos dinámicos algo así como

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

No entiendo lo que quiere decir –

+0

¿Cómo estás ejecutando el SQL? Lea en sql dinámico. –

+0

Un campo con el nombre "cadena"? 'SELECT \' string \ 'FROM \' table \ ''? – jwueller

Respuesta

18

Si la cadena está en su aplicación externa (como PHP), Seguro, simplemente construir la sentencia MySQL.

Si la cadena está dentro de una tabla MySQL, no puede. MySQL no tiene eval() o tal función. Lo siguiente es imposible:

Supongamos que tiene una tabla 'consultas' con un campo "nombre de columna" que hace referencia a uno de los nombres de columna en la tabla "mitabla". Puede haber más columnas en las consultas de los 'que le permiten seleccionar el nombrecolumna desea ...

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

Sin embargo, puede trabajar con PREPARED STATEMENTS. Tenga en cuenta que esto es muy hacky.

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

PREPARE stmt FROM @s; 
EXECUTE stmt; 
+4

declaraciones preparadas no están permitidas dentro de los desencadenantes ... – samrockon

+1

Probablemente un poco tarde en la fiesta, pero qué demonios ... Mencionas que este comportamiento es muy hacky. ¿Pero podrías explicar por qué es esto? Porque esta solución me ayuda mucho, pero no quiero depender de una solución inestable. – mahulst

+1

El código es hacky porque no está utilizando funciones de SQL sencillas (porque esas características no existen). Pero no te preocupes, es estable y no te afectará. ¡Hace diez minutos, lo estoy usando en producción! – dotancohen

0

Si desea seleccionar más de una columna:

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; 
Cuestiones relacionadas