我想选择列名,但我不知道表结构是否会提前更改,因此它可能会发生变化,因此我不能只对带有列名的select语句进行硬编码。我也不想选择每一列。有没有简单的方法可以做到这一点?
我的想法是这两个查询的某种组合,但是我的SQL并不是那么好。
SHOW COLUMNS FROM table_name; SELECT * FROM table_name;
我尝试使用子选择,但没有用。似乎什么都没发生,我没有收到错误,只是没有结果
SELECT (SELECT column_name FROM information_schema.columns WHERE table_name ='table_name') FROM table_name;
也许我需要参加吗?..无论如何,任何帮助都将是很大的,谢谢
试试这个SQLFiddle:
CREATE TABLE atable ( prefix1 VARCHAR(10) ,prefix2 VARCHAR(10) ,notprefix3 INT ,notprefix4 INT ); INSERT INTO atable VALUES ('qwer qwer', 'qwerqwer', 1, 1); INSERT INTO atable VALUES ('qwer qwer', 'asdfaasd', 1, 1); INSERT INTO atable VALUES ('qwer qwer', 'qrt vbb', 1, 1); INSERT INTO atable VALUES ('qwer qwer', 'sdfg sdg', 1, 1); SELECT CONCAT('SELECT ', GROUP_CONCAT(c.COLUMN_NAME), ' FROM atable;') INTO @query FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME = 'atable' AND c.COLUMN_NAME LIKE 'prefix%' ORDER BY c.ORDINAL_POSITION; PREPARE stmt FROM @query; EXECUTE stmt;
一些问题:
您可能需要对结果集进行某种ORDER BY。
就联接和事物而言,您可以做的事情是有限的。
您将验证移至运行时,在运行时,测试很可能会错过它。
您希望能够轻松处理架构更改。该技术将仅处理您可以预见的某种类型的模式更改,而其他任何情况下您都可能不得不更改此代码。