如何使用信息模式获取 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 的小调整版本,它适用于以下限制:
不应该使用没有 where 子句的查询
select * 来自 A;
会变成
select id, city, name from A where 1;
查询不应该有默认的select所有列(*),所有列必须在查询中指定
这会失败
select id, city, name from A;
应该是
select id, city, name from A where 1;
select id, city, name from A where city = 'abc';
某些 column/s 不应成为查询的一部分(如果 column/s 存在读取级别限制,则以下查询将失败(此处 A.name 栏))
select id, city, name from A where 1;
因此,通过在
中添加条目,将豁免列名称添加到编辑器
preferences --> tables --> filter column csv
文本框如下图。
如果有多个列不应成为查询的一部分,则将它们添加为逗号分隔,如下所示
name,city
现在,无论您在何处通过单击编辑器的“内容”选项卡来查看 table 的内容,
编辑器会处理以上所有限制
有效!
考虑具有以下架构的 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 的小调整版本,它适用于以下限制:
不应该使用没有 where 子句的查询
select * 来自 A;
会变成
select id, city, name from A where 1;
查询不应该有默认的select所有列(*),所有列必须在查询中指定
这会失败
select id, city, name from A;
应该是
select id, city, name from A where 1;
select id, city, name from A where city = 'abc';
某些 column/s 不应成为查询的一部分(如果 column/s 存在读取级别限制,则以下查询将失败(此处 A.name 栏))
select id, city, name from A where 1;
因此,通过在
中添加条目,将豁免列名称添加到编辑器preferences --> tables --> filter column csv
文本框如下图。
如果有多个列不应成为查询的一部分,则将它们添加为逗号分隔,如下所示
name,city
现在,无论您在何处通过单击编辑器的“内容”选项卡来查看 table 的内容,
有效!