mysql - 如何使用信息模式获取不允许 select * 的表结果

标签 mysql select subquery information-schema

考虑具有以下架构的表 A,

id | city | name

1 | xyz | A

2 | pqr | B

不允许使用 * 进行查询,例如 SELECT * from table A

但是如果我们指定SELECT id,city,name from table A

为了解决这个问题,我做了以下操作,

SELECT GROUP_CONCAT(column_name SEPARATOR ',') FROM information_schema.columns where table_name='A' LIMIT 1;

结果:ID、城市、名称

尝试过类似的事情,

    SELECT (
           SELECT GROUP_CONCAT(column_name SEPARATOR ',') FROM information_schema.columns where table_name='A' LIMIT 1
           )
     FROM table A;

但是这不起作用, 我还有其他方法可以实现这一目标吗? PS:上面示例中的表列较少,但有些表的列数超过 25-30 列,那么在这种情况下,很难从架构中获取每个列名称并在 select 查询中手动添加。

最佳答案

您需要使用准备好的语句和变量才能使其正常工作。

要获取需要使用 GROUP_CONCAT 的列,它会自动以逗号分隔,将第二个参数作为逗号传递将导致您的字段以两个逗号分隔:

SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS
  WHERE TABLE_SCHEMA = database() AND TABLE_NAME ='A';

--- id,city,name

您可以使用SELECT ... INTO将此查询放入变量中:

SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS 
  WHERE TABLE_SCHEMA = database() AND TABLE_NAME ='A' INTO @columns;

变量@columns现在将保存列名称:

MariaDB [test]> SELECT @columns;
+--------------+
| @columns     |
+--------------+
| id,city,name |
+--------------+

获得构建查询所需的列后

MariaDB [test]> SET @query = CONCAT('SELECT ', @columns, ' FROM A');

您可以通过选择@query来验证查询是否正确:

MariaDB [test]> SELECT @query;
+----------------------------+
| @query                     |
+----------------------------+
| SELECT id,city,name FROM A |
+----------------------------+

对查询感到满意后,准备一条语句并执行它:

MariaDB [test]> PREPARE stmt FROM @query;
MariaDB [test]> EXECUTE stmt;
+----+------+------+
| id | city | name |
+----+------+------+
|  1 | xyz  | A    |
|  2 | pqr  | B    |
+----+------+------+

关于mysql - 如何使用信息模式获取不允许 select * 的表结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44541785/

相关文章:

mysql - SQLPro 到 Vagrant 的连接问题

mysql - 如何使用 sqlalchemy 在 mysql 中设置 DEFAULT ON UPDATE CURRENT_TIMESTAMP?

mysql - 具有两列的内连接

sql - 在 db2 中优化查询

php - 无法将 DataGrip 连接到使用 XAMPP 托管的数据库

xml - Robotframework:如何在选择字段中接收所有项目的列表?

mysql 选择此查询然后用此查询填充?

sql - WHERE col1,col2 IN (...) [使用复合主键的 SQL 子查询]

MySQL:返回另一个表中不存在相关条目的字段

MySQL UDF 库安装