2010-12-13 35 views
18

có thể chọn trường có tên là chuỗi không?Tên trường mysql từ biến

SELECT 'fieldname' FROM table

tôi cần điều này cho kích hoạt để có tên trường năng động cái gì đó như

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

Tôi không hiểu những gì bạn có nghĩa là –

+0

How are you chạy sql? Đọc trên sql động. –

+0

Trường có tên "chuỗi"? 'SELECT \' string \ 'FROM \' table \ ''? – jwueller

Trả lời

18

Nếu chuỗi là trong ứng dụng bên ngoài của bạn (như PHP), chắc chắn, chỉ cần xây dựng báo cáo kết quả MySQL.

Nếu chuỗi nằm trong bảng MySQL, bạn không thể. MySQL không có hàm eval() hoặc hàm như vậy. Sau đây là không thể:

Giả sử bạn có bảng 'truy vấn' với trường "cột tên" đề cập đến một trong các tên cột trong bảng "mytable". Có thể có các cột bổ sung trong 'truy vấn' cho phép bạn chọn tên cột bạn muốn ...

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

Tuy nhiên, bạn có thể làm việc với PREPARED STATEMENTS. Hãy nhận biết điều này là rất hacky.

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

PREPARE stmt FROM @s; 
EXECUTE stmt; 
+4

các câu lệnh chuẩn bị không được phép trong các trình kích hoạt ... – samrockon

+1

Có lẽ hơi muộn tại bữa tiệc, nhưng cái quái gì ... Bạn đề cập đến hành vi này rất khó hiểu. Nhưng có lẽ bạn có thể giải thích tại sao điều này? Bởi vì giải pháp này giúp tôi rất nhiều, nhưng tôi không muốn phụ thuộc vào một sửa chữa không ổn định. – mahulst

+1

Mã này bị hack vì nó không sử dụng các tính năng SQL đơn giản (vì các tính năng đó không tồn tại). Nhưng đừng lo lắng, nó ổn định và sẽ không phá vỡ bạn. Đến mười phút trước, tôi đang sử dụng nó trong sản xuất! – dotancohen

0

Nếu bạn muốn chọn nhiều hơn một cột:

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; 
Các vấn đề liên quan