有一个手机号码属性表table1(mobile,user_name,user_id,source),分别代表的含义是(手机号,用户姓名,用户身份证号,号码来源);
现在的需求是经常会有不同业务部门的数据过来,除了更新mobile,user_name,user_id字段以外,还要更新号码的来源source;
一个号码可能从几个业务部门过来,可以拥有数个不同的来源,不同的来源间用逗号分隔,同一来源不能重复再source中出现,示例数据如下:
mobile user_name user_id source
18768196600 qwe 411124 业务1,业务2
18768196601 rty 411125 业务1,业务3,业务2
18768196602 uio 411126 业务4,业务2
18768196603 pas 411127
现在从业务2部来了一个新表,table2(mobile,user_name,user_id) 更新的语句如下:
MERGE INTO table1 a
USING table2 b
ON (a.mobile = b.mobile)
WHEN MATCHED THEN
UPDATE SET a.user_name = nvl(b.user_name,a.user_name),
a.user_id = nvl(b.user_id,a.user_id),
a.SOURCE = concat(a.SOURCE,nvl2(a.SOURCE,',业务2','业务2'))
先发现这个语句的问题是,会出现来源不断重复的现象,如
18768196600 qwe 411124 业务1,业务2,业务2,业务1
这需要做判断:1.source为空 插入'业务2'
2.source不为空,又分两种:source中已包含'业务2',插入'';source中不包含'业务2',插入',业务2'
请问有没有在merge into 中解决这个问题的简洁方法?
------解决思路----------------------
写个函数,拆分重新合并
FUNCTION CONCATSTR(P_STR IN VARCHAR2,P_NEW IN VARCHAR2) RETURN VARCHAR2 IS
V_RESULT VARCHAR2(4000);
BEGIN
SELECT WMSYS.WM_CONCAT(DISTINCT STR) INTO V_RESULT
FROM(
select REGEXP_SUBSTR(P_STR, '[^,]+', 1, LEVEL) STR
from DUAL
CONNECT BY LEVEL <= REGEXP_COUNT(P_STR, '[^,]+')
UNION ALL
SELECT P_NEW AS STR FROM DUAL
);
RETURN V_RESULT;
END;
赋值语句改成这样
a.SOURCE = CONCATSTR(a.SOURCE,'业务2')
------解决思路----------------------
试了下,distinct与WMSYS.WM_CONCAT不能联合使用
调整下,把diatinct去掉,把union all 改为 union即可
FUNCTION CONCATSTR(P_STR IN VARCHAR2,P_NEW IN VARCHAR2) RETURN VARCHAR2 IS
V_RESULT VARCHAR2(4000);
BEGIN
SELECT WMSYS.WM_CONCAT(STR) INTO V_RESULT
FROM(
select REGEXP_SUBSTR(P_STR, '[^,]+', 1, LEVEL) STR
from DUAL
CONNECT BY LEVEL <= REGEXP_COUNT(P_STR, '[^,]+')
UNION
SELECT P_NEW AS STR FROM DUAL
);
RETURN V_RESULT;
END;
------解决思路----------------------
正则、递归、字符串连接