Mysql 我是否可以执行只返回与通配符匹配的列的数据的查询?
我有一个包含许多列的表Mysql 我是否可以执行只返回与通配符匹配的列的数据的查询?,mysql,information-schema,Mysql,Information Schema,我有一个包含许多列的表MyTable,但这些列的名称有一个模式,如: `BLOCK_A_PARAM_1` INT, `BLOCK_A_PARAM_2` INT, `BLOCK_A_PARAM_3` INT, `BLOCK_A_PARAM_4` INT, --- ... `BLOCK_A_PARAM_25` INT, `BLOCK_A_PARAM_26` INT, `BLOCK_B_PARAM_1` INT, `BLOCK_B_PARAM_2` INT, `BLOCK_B_PARAM_2` INT
MyTable
,但这些列的名称有一个模式,如:
`BLOCK_A_PARAM_1` INT,
`BLOCK_A_PARAM_2` INT,
`BLOCK_A_PARAM_3` INT,
`BLOCK_A_PARAM_4` INT,
--- ...
`BLOCK_A_PARAM_25` INT,
`BLOCK_A_PARAM_26` INT,
`BLOCK_B_PARAM_1` INT,
`BLOCK_B_PARAM_2` INT,
`BLOCK_B_PARAM_2` INT,
--- ...
由于一些原因,这些数据不会分布在多个表中。我的表本身并没有缺少标准化,不过如果每个块位于不同的表中,这项任务会更容易。不管怎样,我在这里
如果我想构造一个查询,只返回名称与BLOCK\u a%
匹配的列的数据,我该怎么做?
这仅用于开发期间的实用程序,而不会成为我的应用程序逻辑的一部分
我已经试过了:
SELECT (SHOW COLUMNS FROM `MyTable`
WHERE `Field` LIKE "BLOCK_A_%") FROM `MyTable`;
但由此产生的错误表明,SHOW COLUMNS
作为子查询的语法无效
第二次尝试:
SELECT * FROM (SELECT * FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_NAME` = "MyTable"
AND `COLUMN_NAME` LIKE "BLOCK_A_%") `_`;
只列出表模式的详细信息(即外部查询完全无用)
最后:
SELECT (SELECT * FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_NAME` = "MyTable"
AND `COLUMN_NAME` LIKE "BLOCK_A_%")
FROM `MyTable`;
但这会导致以下错误:
操作数应包含1列
那么,有没有办法做到这一点?请用MySQL;不要给我任何PHP/ASP.NET/etc 使用准备好的语句,您可以从
信息\u模式
动态构建查询,然后执行它:
SET @QUERY=CONCAT_WS(" ",
"SELECT",
(SELECT GROUP_CONCAT(`COLUMN_NAME`) FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_NAME` = "MyTable" AND `COLUMN_NAME` LIKE "BLOCK_A_%"),
"FROM `MyTable`");
PREPARE myQuery FROM @QUERY;
EXECUTE myQuery;
@草莓:如果目标是让我的生活在开发过程中变得更快一点,那么改变数据库的布局就不是“方法”;)@草莓:我数据库中的许多其他字段和表都使用关系逻辑,但不是这些。除了inspection元素的这个实用程序之外,将它们拆分为多个表对它们没有任何好处。他们之间没有多对一、多对多的关系。我要做的就是让我的应用程序代码变得比它需要的更复杂。这个问题纯粹是一个技术问题:在语义层面上,我所有的
BLOCK\u a%
字段之间没有特殊的关系,这就需要考虑设计。使用RDBMS并不意味着所有内容都必须毫无理由地放在自己的表中。@草莓:“自我提升”?你为什么这么说?你是否意识到自我回答不仅被允许,而且被鼓励?在“提问”页面上有一个按钮?这是关于分享知识!今天早些时候,我找到了下面的解决方案,并决定与全世界免费分享。@草莓:不,答案是同时发布到问题上的:也就是说,时间戳是相同的。请参考我之前的评论,以及。我确实发布了几个自我回答的问题。非常感谢。