DB2 SQL400(AS400环境)调整查询列顺序且无需枚举全部列的方法
DB2 for i(SQL400)调整列顺序的高效实现方法
分两种场景提供对应解决方案:
场景1:仅查询输出时调整列顺序,不修改物理表结构
无需手动编写包含100多个列的SELECT语句,直接通过系统元数据表自动生成符合要求的查询子句:
- 先确认需要放在最左侧的列的优先级顺序,你示例的顺序优先级为:
FirstName3>LastName1>SSN2>FirstVisit6>TimeofVisit7 - 执行以下元数据查询,注意替换语句中的
你的库名、MYDATATABLE为实际的库名和表名:
SELECT LISTAGG(COLUMN_NAME, ', ') WITHIN GROUP (ORDER BY CASE COLUMN_NAME WHEN 'FirstName3' THEN 1 WHEN 'LastName1' THEN 2 WHEN 'SSN2' THEN 3 WHEN 'FirstVisit6' THEN 4 WHEN 'TimeofVisit7' THEN 5 ELSE 6 END, ORDINAL_POSITION) AS SELECT_CLAUSE FROM QSYS2.SYSCOLUMNS WHERE TABLE_SCHEMA = '你的库名' AND TABLE_NAME = 'MYDATATABLE';
- 把查询得到的
SELECT_CLAUSE结果复制出来,拼接上FROM 你的库名.MYDATATABLE就是完整的查询语句,自动满足列排序规则:指定列排在最前,剩余列保持原表的顺序依次排列。
场景2:需要永久修改物理表的列顺序
如果你的AS400系统的DB2 for i版本在7.2及以上,可以直接用REPOSITION语法调整列位置,无需重建表:
-- 按你需要的顺序依次调整列位置 ALTER TABLE MYDATATABLE ALTER COLUMN FirstName3 REPOSITION TO 1; ALTER TABLE MYDATATABLE ALTER COLUMN LastName1 REPOSITION TO 2; ALTER TABLE MYDATATABLE ALTER COLUMN SSN2 REPOSITION TO 3; ALTER TABLE MYDATATABLE ALTER COLUMN FirstVisit6 REPOSITION TO 4; ALTER TABLE MYDATATABLE ALTER COLUMN TimeofVisit7 REPOSITION TO 5;
调整完成后,后续使用SELECT *查询该表时,默认就会返回你要求的列顺序。
如果版本低于7.2不支持REPOSITION语法,可以复用场景1的方法生成完整的列顺序列表,再基于此生成建表语句,导数据重建表即可,相比手动写列名效率高很多。
内容的提问来源于stack exchange,提问作者TommyV
相关产品推荐
相关产品推荐

