2010-12-13 6 views
18

Можно ли выбрать поле, имя которого является строкой?имя поля mysql от переменной

SELECT 'fieldname' FROM table

я это нужно для запуска, чтобы иметь динамические имена полей что-то вроде

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

Я не понимаю, что вы имеете в виду –

+0

Как вы работаете в SQL? Читайте на динамическом sql. –

+0

Поле с именем "string"? 'SELECT \' string \ 'FROM \' table \ ''? – jwueller

ответ

18

Если строка во внешнем приложении (например, PHP), конечно, просто построить оператор MySQL.

Если строка находится в таблице MySQL, вы не можете. MySQL не имеет eval() или такой функции. Невозможно следующее:

Предположим, что у вас есть таблица «запросы» с полем «имя столбца», которое относится к одному из имен столбцов в таблице «mytable». Там могут быть дополнительные столбцы в «запросах», которые позволяют выбрать ColumnName вы хотите ...

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

Однако вы можете работать с PREPARED STATEMENTS. Помните, что это очень хаки.

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

PREPARE stmt FROM @s; 
EXECUTE stmt; 
+4

подготовленные заявления не допускаются в триггеры ... – samrockon

+1

Возможно, немного поздно на вечеринке, но что за черт ... Вы упомянули, что это поведение очень хаки. Но не могли бы вы объяснить, почему это так? Потому что это решение мне очень помогает, но я не хочу зависеть от неустойчивого исправления. – mahulst

+1

Код взломан, потому что он не использует простые функции SQL (поскольку эти функции не существуют). Но не беспокойтесь, он стабилен и не будет ломать вас. С десяти минут назад я использую его в производстве! – dotancohen

0

Если вы хотите выбрать более одного столбца:

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; 
Смежные вопросы