我有一个包含大约 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)
...但是写每个列名是很累人的。如果可能的话,我正在寻找一种循环方法。
这看起来像是针对 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)
归档时间: |
|
查看次数: |
10769 次 |
最近记录: |