如何在mySQL中动态选择列名

如何在mySQL中动态选择列名,mysql,sql,metadata,dynamic-sql,Mysql,Sql,Metadata,Dynamic Sql,我想选择列名,但我事先不知道表结构,它可能会改变,所以我不能用列名硬编码select语句。我也不想选择每一列。有没有简单易行的方法 我的想法是,这是这两个查询的某种组合,但我的SQL不是很好 SHOW COLUMNS FROM table_name; SELECT * FROM table_name; 我试着使用一个子选择,但它不起作用。似乎什么都没发生,我没有出错,只是没有结果 SELECT (SELECT column_name FROM information_sch

我想选择列名,但我事先不知道表结构,它可能会改变,所以我不能用列名硬编码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;
也许我需要加入?。。 不管怎样,任何帮助都会很好,谢谢你试试这个:

一些问题:

您可能需要对结果集进行某种排序

在连接和其他方面,您所能做的是有限的

您将验证转移到运行时,在运行时,测试很可能会错过验证


您希望能够轻松地处理模式更改。这种技术只能处理您可以预见的特定类型的模式更改,而其他类型的更改您可能无论如何都必须更改此代码。

表结构不断变化似乎很奇怪,这听起来像是设计缺陷。你能发布你当前的结构或在你的表格上提供更多的上下文吗?它不是不断变化的。然而,表格的最终结构还没有确定下来,因此我正在尝试建立一个足够智能的系统,以适应未来可能发生的任何变化。我事先不知道列名。我可以在PHP中通过两个单独的查询来实现这一点,但我想我也可以在数据库层实现这一点。我想我可以得到列名,然后使用这些数据来查询表,基本上构建一个动态select语句。你可以用动态SQL来实现这一点(实际上是两个查询),但是如果你不想要所有的列,您必须在查询中编码,从元数据中选择列,以确定包含列的条件(以及您想要的任何特定顺序)。但不能将元数据查询的结果直接转换为选择查询的选择列表。@Cade Roux我的列名条件是列名的前缀。我在想,我可以基于此排除或包括。“显示表_name中字段%prefix%的列”是的,我明白你的意思。我曾希望能够创建一种智能查询系统,根据我可以定义和更改的一组规则,只获取某些列。我对这种方法研究得越多,我就越意识到它可能会带来更多的复杂性,那么它的价值就越大。不过,我从来没有想过使用CONCAT,因为它很聪明。@sooker代码生成和动态SQL在使系统更易于维护方面占有一席之地。事实上,我有一个关于使用元数据生成代码和数据库代码运行状况监视的完整演示。但我不认为它在这个特殊场景中有更好的地位。
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;