2010-12-13 136 views
18

是否可以選擇字段名稱是字符串?來自變量的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

回答

18

如果字符串是在外部應用程序(如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

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;