如何使用信息模式获取 table 结果,其中 select * 是不允许的

How to use information schema to get table result where select * is not allowed

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

id | city | name

1 | xyz | A

2 | pqr | B

不允许查询带有 * like 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,city,name

尝试过类似的东西,

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

但是不行, 还有其他方法可以实现吗? PS:上面示例中的 table 列较少,但有 table 超过 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    |
+----+------+------+

以下查询限制是我问这个问题的原因,我喜欢 sequelpro 的小调整版本,它适用于以下限制:

  1. 不应该使用没有 where 子句的查询

    select * 来自 A;

    会变成

    select id, city, name from A where 1;

  2. 查询不应该有默认的select所有列(*),所有列必须在查询中指定

    这会失败

    select id, city, name from A;

    应该是

    select id, city, name from A where 1;

    select id, city, name from A where city = 'abc';

  3. 某些 column/s 不应成为查询的一部分(如果 column/s 存在读取级别限制,则以下查询将失败(此处 A.name 栏))

    select id, city, name from A where 1;

因此,通过在

中添加条目,将豁免列名称添加到编辑器

preferences --> tables --> filter column csv

文本框如下图。

如果有多个列不应成为查询的一部分,则将它们添加为逗号分隔,如下所示

name,city

现在,无论您在何处通过单击编辑器的“内容”选项卡来查看 table 的内容, 编辑器会处理以上所有限制

有效!