考虑具有以下架构的表 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/