当前位置: 代码迷 >> Oracle管理 >> 关于反复更新(concat)一列中的数据的有关问题
  详细解决方案

关于反复更新(concat)一列中的数据的有关问题

热度:407   发布时间:2016-04-24 04:10:01.0
关于反复更新(concat)一列中的数据的问题
有一个手机号码属性表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;

------解决思路----------------------
正则、递归、字符串连接
  相关解决方案