如何编写SQL依据规则表关联列名与列值替换主表填充值
SQL实现方案
首先预设两张表的核心字段逻辑(和示意图结构对齐):
- TABLE A(规则表)核心字段:
indicator(规则标识)、match_column(主表待匹配的列名)、match_value(匹配阈值)、target_value(替换FILL的目标值) - TABLE B(主表)核心字段:
C1、C2等业务列、待替换的FILL列
单规则(仅匹配C1的indicator=3规则)实现
查询生成新结果表(不修改原表)
SELECT b.*, CASE WHEN b.C1 = a.match_value THEN a.target_value ELSE b.FILL END AS FILL FROM TABLE_B b LEFT JOIN TABLE_A a ON a.indicator = 3 AND a.match_column = 'C1'
直接更新主表原FILL字段
UPDATE TABLE_B b INNER JOIN TABLE_A a ON a.indicator = 3 AND a.match_column = 'C1' AND b.C1 = a.match_value SET b.FILL = a.target_value
可扩展多规则实现(后续新增其他indicator规则无需大改SQL)
如果后续需要批量生效TABLE A中配置的多组规则,可通过多条件分支适配所有配置的匹配列:
SELECT b.*, COALESCE( CASE WHEN a.match_column = 'C1' AND b.C1 = a.match_value THEN a.target_value WHEN a.match_column = 'C2' AND b.C2 = a.match_value THEN a.target_value -- 新增其他列规则直接在此处追加分支即可 END, b.FILL ) AS FILL FROM TABLE_B b LEFT JOIN TABLE_A a ON a.indicator IN (3) -- 此处可传入多个需要生效的规则indicator值
如果你使用的是支持动态列引用的SQL引擎(如Spark SQL、PostgreSQL),可以进一步去掉硬编码的列分支,直接通过规则表的
match_column字段动态匹配主表对应列,完全适配规则表的无感知扩展。
内容的提问来源于stack exchange,提问作者Michael Loh
相关产品推荐
相关产品推荐

