如何使用信息模式来获取不允许选择*的表结果

时间:2017-06-14 10:12:53

标签: mysql select subquery information-schema

考虑具有以下模式的表A,

  

id |城市|名称

     

1 | xyz |甲

     

2 | pqr |乙

* 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:上面示例中的表格列较少,但是有超过25-30列的表格,在这种情况下,很难从模式中获取每个列名称并在选择查询中手动添加。

2 个答案:

答案 0 :(得分:1)

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

要获取您需要使用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    |
+----+------+------+

答案 1 :(得分:0)

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

  1. 如果没有where子句

    ,则不应使用查询

    从A中选择*;

    将成为

    从A中选择id,city,name;

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

    这将失败

    从A中选择id,city,name;

    应该是

    从A中选择id,city,name 1;

    从A中选择id,city,name,其中city ='abc';

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

    从A中选择id,city,name;

  4. 因此,通过在

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

    偏好设置 - >表格 - >过滤列csv

    文本框如下所示。

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

      

    名称,城市

    enter image description here

    现在,只要点击编辑器的“内容”标签查看表格内容, enter image description here编辑将负责上述所有限制

    它有效!