来自变量的mysql字段名称

问题描述:

是否可以选择字段名称是字符串?来自变量的mysql字段名称

SELECT 'fieldname' FROM table

我需要这个触发器具有动态字段名 像

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

我不明白你的意思 – 2010-12-13 12:26:56

+0

你是如何运行的SQL?阅读动态SQL。 – 2010-12-13 12:27:49

+0

名称为“字符串”的字段? 'SELECT \'string \'FROM \'table \''? – jwueller 2010-12-13 12:29:46

如果字符串是在外部应用程序(如PHP),当然,只是构建了MySQL的声明。

如果字符串在MySQL表内,则不能。 MySQL没有eval()或这样的函数。以下是不可能的:

假设您有一个表“查询”,其字段“columnname”引用了表“mytable”中的一个列名。有可能是其他列在“查询”,让您选择您想要的列名...

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 2010-12-13 13:01:52

+1

大概晚了一点在派对上,但是到底是什么......你提到这种行为非常黑客。但是,你能解释一下为什么?因为这个解决方案对我有很大帮助,但我不想依赖于不稳定的修复。 – mahulst 2012-03-15 12:23:43

+1

由于代码不使用简单的SQL功能(因为这些功能不存在),因此该代码很晦涩难懂。但别担心,它是稳定的,不会在你身上发生。到十分钟前,我正在生产中使用它! – dotancohen 2012-08-06 11:39:38

如果要选择多列:

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;