Oracle PL/SQL 动态SQL实现条件拼接生成CONCAT_REL表唯一表达式
业务需求说明
现有两张业务表:
COND_REL:存储条件、方法及关联关系,业务侧会录入条件数据,每周都会更新CONDITION_NAME字段内容CONCAT_REL:最终输出表,存储所有唯一CONDITION_NAME对应的拼接条件结果
需要基于COND_REL表数据通过动态SQL拼接生成唯一的条件表达式存入CONCAT_REL表,无需硬编码适配每周更新的内容。
表结构详情
-- COND_REL 表结构及示例数据 CONDTION_NAME FILD OPERTION VALUE OPERND METHOD1 SHIPMENT_MODE = AIRWAY AND METHOD1 TYP = BOX OR METHOD1 TYP = ENVELOPE METHOD2 SHIPMENT_MODE = RAIL_ROAD AND METHOD2 TYP = CONTAINER AND METHOD2 DELIVERY_PH <> CALL AND METHOD2 DELIVERY_TYP = HOUSE METHOD3 TYP = FRAGILE AND METHOD3 DELIVERY_PH = TEXT OR METHOD3 DELIVERY_TYP = OFFICE METHOD4 ACKNOWLDGE = YES
-- CONCAT_REL 表预期输出结果 UNIQUE_MET UNIQUE_EXPRESION METHOD1 SHIPMENT_MODE = 'AIRWAY' AND TYP = 'BOX' OR TYP = 'ENVELOPE' METHOD2 SHIPMENT_MODE = 'RAIL_ROAD' AND TYP = 'CONTAINER' AND DELIVERY_PH <> 'CALL' AND DELIVERY_TYP = 'HOUSE' METHOD3 TYP = 'FRAGILE' AND DELIVERY_PH = 'TEXT' OR DELIVERY_TYP = 'OFFICE' METHOD4 ACKNOWLDGE = 'YES'
动态SQL实现方案
以下为Oracle环境实现代码,每周定时执行即可自动同步所有新增/更新的条件表达式,无需修改硬编码逻辑:
MERGE INTO CONCAT_REL tgt USING ( SELECT CONDTION_NAME AS UNIQUE_MET, -- 按方法分组拼接条件,自动处理操作符、值加单引号,去掉末尾多余的逻辑符 RTRIM(LISTAGG(FILD || ' ' || OPERTION || ' ''' || VALUE || ''' ' || NVL(OPERND, ''), ' ') WITHIN GROUP (ORDER BY ROWNUM), ' AND|OR ') AS UNIQUE_EXPRESION FROM COND_REL GROUP BY CONDTION_NAME ) src ON (tgt.UNIQUE_MET = src.UNIQUE_MET) WHEN MATCHED THEN UPDATE SET tgt.UNIQUE_EXPRESION = src.UNIQUE_EXPRESION WHEN NOT MATCHED THEN INSERT (UNIQUE_MET, UNIQUE_EXPRESION) VALUES (src.UNIQUE_MET, src.UNIQUE_EXPRESION);
注意:如果需要严格按照业务录入的条件顺序拼接,将
ORDER BY ROWNUM替换为ORDER BY 你的顺序字段(比如自增主键ID、排序号字段)即可;MySQL环境可将LISTAGG函数替换为GROUP_CONCAT实现相同逻辑。
内容的提问来源于stack exchange,提问作者Cool_Oracle
相关产品推荐
相关产品推荐

