Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我是否可以执行只返回与通配符匹配的列的数据的查询?_Mysql_Information Schema - Fatal编程技术网

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并不意味着所有内容都必须毫无理由地放在自己的表中。@草莓:“自我提升”?你为什么这么说?你是否意识到自我回答不仅被允许,而且被鼓励?在“提问”页面上有一个按钮?这是关于分享知识!今天早些时候,我找到了下面的解决方案,并决定与全世界免费分享。@草莓:不,答案是同时发布到问题上的:也就是说,时间戳是相同的。请参考我之前的评论,以及。我确实发布了几个自我回答的问题。非常感谢。