日期:2014-05-17  浏览次数:21022 次

怎样用字典表的数据替换另一个表中某个字段的值?
现有 字典表tba
字段如下  
dm  nr
01  新增
02  修改
03  统计
04  XX
05  aaa
06  ...

用户表  user  (字段qx对应 字典表tba的dm,每个id可以有多个功能,用逗号分隔 )

id       qx

admin   功能1,功能2,功能3
001     01
002     01,02
003     01,03 
004     05

现在想显示这样的效果  (把qx地段里的代码替换成 字段表tba里的nr)

admin   新增,修改,统计
001     新增
002     新增,修改
003     新增,统计 
004     aaa

这个sql语句该怎样写呀?



谢谢大家

sql 替换 字典 oracle 字段

------解决方案--------------------
不好做,如果字典中的数据不确定,不能使用系统函数,还是自已写个函数实现吧。。。
------解决方案--------------------
首先判断的逗号的个数,然后依据逗号逐段的截取字符,然后与码表关联。
------解决方案--------------------
原理相同的做法,参照
http://blog.csdn.net/java3344520/article/details/5731758
------解决方案--------------------
分两步
--1、单行字段拆分为多行,下面只是给个以前的例子
with t1 as
(
select '张三' c1,'胸外科,皮肤科' c2,date'2000-11-19' c3  from dual
union all
select '李四','胸外科',date'2001-01-04'  from dual
union all
select '王五','妇产科,骨科',date'2001-01-08' from dual
)

select c1,
  substr(','
------解决方案--------------------
c2
------解决方案--------------------
',',instr(','
------解决方案--------------------
c2,',',1,b.rn)+1,
  instr(c2
------解决方案--------------------
',',',',1,b.rn)-instr(','
------解决方案--------------------
c2,',',1,b.rn)) c2,c3
from t1,
  (select rownum rn from t1
  connect by rownum<10
--connect by rownum < nvl(length(regexp_replace(c2,'[^,]')),0)
) b
  where length(c2)-length(replace(c2,','))+1>=b.rn
order by c1,b.rn
--10这个常量也可以改为读取字段中信息:nvl(length(regexp_replace(c2,'[^,]')),0)

--2、拆分的结果与字典表联立查询,这个你应该会吧

--3、The Oracle WM_CONCAT Function,WM_CONCAT再把字段重新拼回来。

------解决方案--------------------

create or replace function fn_convertcode(
    p_instr in varchar2
) return varchar2 is

    v_instr    varchar2(100);
    v_typeid   varchar2(10);
    v_typename varchar2(100);    
    v_result varchar2(100);    
begin

    v_instr  := p_instr;
    v_result := '';
    
    loop