如何在mySQL中动态选择列名

时间:2013-03-19 18:31:54

标签: mysql sql metadata dynamic-sql

我想选择列名,但我不会提前知道表结构,它可能会发生变化,所以我不能用列名硬编码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;

也许我需要加入?... 无论如何,任何帮助都会很棒,谢谢

1 个答案:

答案 0 :(得分:2)

试试这个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。

在连接和事物方面你可以做的事情是有限的。

您将验证移至运行时,通过测试更有可能遗漏它。

您希望能够轻松处理架构更改。此技术仅处理您可以预见的某种类型的架构更改,而其他人则可能必须更改此代码。