仅从表中选择某些列

-4 mysql select concat

我有一个包含大约 200 列的 MySQL 表。

每列的名称是col_i(i=1 ,2,..200)。

假设我只需要选择前 50 列,我应该如何进行?

我找到了有关该concat()功能的信息,但我无法使用它。

我知道这可以手动完成,例如通过编写:

SELECT col_1, col_2, ..., col_50 FROM table_1 ;
Run Code Online (Sandbox Code Playgroud)

...但是写每个列名是很累人的。如果可能的话,我正在寻找一种循环方法。

Rol*_*DBA 5

这看起来像是针对 information_schema 的动态 SQL 的作业

假设您SELECT针对的是表mydb.mytable,并且查询如下所示:

SELECT col_1,col_2,...,col_n FROM mydb.mytable WHERE id = 27;
Run Code Online (Sandbox Code Playgroud)

您想要SELECT列表中的前 50 列吗?这里是:

SET group_concat_max_len = 1048576;
SET @first_column = 1;
SET @final_column = 50;
SET @db = 'mydb';
SET @tb = 'mytable';
SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position)
INTO @select_column_list
FROM information_schema.columns
WHERE table_schema=@db
AND table_name=@tb
AND ordinal_position >= @first_column
AND ordinal_position <= @final_column;
SET @sql = CONCAT('SELECT ',@select_column_list,' FROM ',@db,'.',@tb,' WHERE id = 27');
PREPARE s FROM @sql;
EXECUTE s;
DEALLOCATE PREPARE s;
Run Code Online (Sandbox Code Playgroud)

想要SELECT列表中的第 10-18列吗?做这个:

SET group_concat_max_len = 1048576;
SET @first_column = 10;
SET @final_column = 18;
SET @db = 'mydb';
SET @tb = 'mytable';
SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position)
INTO @select_column_list
FROM information_schema.columns
WHERE table_schema=@db
AND table_name=@tb
AND ordinal_position >= @first_column
AND ordinal_position <= @final_column;
SET @sql = CONCAT('SELECT ',@select_column_list,' FROM ',@db,'.',@tb,' WHERE id = 27');
PREPARE s FROM @sql;
EXECUTE s;
DEALLOCATE PREPARE s;
Run Code Online (Sandbox Code Playgroud)

等等。

如果您想查看精心制作的 SQL,请在运行之前执行此操作SELECT

SELECT @sql\G
PREPARE s FROM @sql;
EXECUTE s;
DEALLOCATE PREPARE s;
Run Code Online (Sandbox Code Playgroud)

试一试 !!!