SQL实战:如何依据COLB与COLD条件填充COLJ列值?
解决你的SQL动态填充需求
核心逻辑
要实现按分组提取指定列的值填充COLJ,核心是先拿到每个COLF+COLH分组里的参考记录(即COLA = COLB的行),再根据COLD指定的列名动态取值。
静态列场景(已知COLD可能的取值)
如果COLD只会用到固定的几个列(比如你提到的COLC、COLE、COLP、COLK),直接用CASE+关联查询就能搞定,示例代码如下:
SELECT t.*, -- 根据COLD的值选择对应列的参考值 CASE t.COLD WHEN 'COLC' THEN ref.COLC WHEN 'COLE' THEN ref.COLE WHEN 'COLP' THEN ref.COLP WHEN 'COLK' THEN ref.COLK ELSE NULL -- 处理未定义的列名 END AS COLJ FROM your_table t -- 关联分组内的参考记录 JOIN ( SELECT COLF, COLH, COLC, COLE, COLP, COLK FROM your_table WHERE COLA = COLB -- 筛选出每组中作为参考的那条记录 ) ref ON t.COLF = ref.COLF AND t.COLH = ref.COLH;
说明
- 子查询
ref负责把每个COLF+COLH分组里的参考行的所有目标列都提取出来 - 外层通过
CASE匹配当前行的COLD值,从ref里取对应的列值赋值给COLJ - 要加新的支持列,只需要在子查询和CASE分支里同步添加就行
动态列场景(COLD可能是任意列名)
如果COLD的取值不确定、需要支持任意列,就得用动态SQL生成查询逻辑。下面是PostgreSQL的实现示例(MySQL 8.0+也可以类似改写):
DO $$ DECLARE case_branches TEXT; target_cols TEXT; BEGIN -- 自动生成CASE分支和目标列列表 SELECT string_agg(DISTINCT format('WHEN ''%s'' THEN ref.%s', COLD, COLD), ' '), string_agg(DISTINCT COLD, ', ') INTO case_branches, target_cols FROM your_table; -- 执行动态生成的查询 EXECUTE format(' SELECT t.*, CASE t.COLD %s ELSE NULL END AS COLJ FROM your_table t JOIN ( SELECT COLF, COLH, %s FROM your_table WHERE COLA = COLB ) ref ON t.COLF = ref.COLF AND t.COLH = ref.COLH; ', case_branches, target_cols); END $$;
这个脚本会自动读取表中所有出现过的COLD值,生成对应的查询逻辑,无需手动枚举列名。
内容的提问来源于stack exchange,提问作者GIN
相关产品推荐
相关产品推荐

