2010-12-13 15 views
18

ist es möglich, Feld, dessen Name ist Zeichenfolge?mysql Feldname von Variable

SELECT 'fieldname' FROM table

ich brauche dies für Triggernamen dynamischen Feldes so etwas wie

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

Ich verstehe nicht, was Sie meinen –

+0

Wie werden Sie die SQL ausgeführt wird? Lesen Sie auf dynamische sql. –

+0

Ein Feld mit dem Namen "string"? 'SELECT \' string \ 'FROM \' table \ ''? – jwueller

Antwort

18

zu haben, wenn die Zeichenfolge in Ihrer externen Anwendung (wie PHP) ist, sicher, nur die MySQL-Anweisung konstruieren.

Wenn die Zeichenfolge in einer MySQL-Tabelle ist, können Sie nicht. MySQL hat keine eval() oder eine solche Funktion. Folgendes ist unmöglich:

Angenommen, Sie haben eine Tabelle "Abfragen" mit einem Feld "Spaltenname", das auf einen der Spaltennamen in der Tabelle "Mytable" verweist. Es könnten zusätzliche Spalten in ‚Abfragen‘ sein, mit denen Sie die Spalten Sie auswählen möchten ...

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

Sie können jedoch mit PREPARED STATEMENTS arbeiten. Seien Sie sich bewusst, dass dies sehr hacky ist.

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

PREPARE stmt FROM @s; 
EXECUTE stmt; 
+4

vorbereitete Anweisungen sind nicht erlaubt innerhalb von Triggern ... – samrockon

+1

Wahrscheinlich ein bisschen spät auf der Party, aber was zur Hölle ... Sie erwähnen dieses Verhalten ist sehr hacky. Aber könnten Sie vielleicht erklären, warum das so ist? Weil mir diese Lösung sehr hilft, aber ich möchte mich nicht auf eine instabile Lösung verlassen. – mahulst

+1

Der Code ist Hacky, weil er keine einfachen SQL-Funktionen verwendet (weil diese Funktionen nicht existieren). Aber mach dir keine Sorgen, es ist stabil und wird dir nicht brechen. Vor zehn Minuten benutze ich es in der Produktion! – dotancohen

0

Wenn Sie mehr als eine Spalte auszuwählen:

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;