考虑具有以下模式的表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列的表格,在这种情况下,很难从模式中获取每个列名称并在选择查询中手动添加。
答案 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的小调整版本,该版本适用于以下限制:
如果没有where子句
,则不应使用查询从A中选择*;
将成为
从A中选择id,city,name;
查询不应该有默认选择所有列(*),所有列都必须在查询中指定
这将失败
从A中选择id,city,name;
应该是
从A中选择id,city,name 1;
从A中选择id,city,name,其中city ='abc';
某些列不应该是查询的一部分(如果列/ s存在读取级别限制,则以下查询将失败(此处为A.name列))
从A中选择id,city,name;
因此,通过在
中添加条目,将豁免列名添加到编辑器中偏好设置 - >表格 - >过滤列csv
文本框如下所示。
如果有多个列不应该是查询的一部分,那么将它们添加为逗号分隔,如下所示
名称,城市
现在,只要点击编辑器的“内容”标签查看表格内容,
编辑将负责上述所有限制
它有效!