现有 字典表tba
字段如下
dm nr
01 新增
02 修改
03 统计
04 XX
05 aaa
06 ...用户表 user (字段qx对应 字典表tba的dm,每个id可以有多个功能,用逗号分隔 )id qxadmin 功能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字段
字段如下
dm nr
01 新增
02 修改
03 统计
04 XX
05 aaa
06 ...用户表 user (字段qx对应 字典表tba的dm,每个id可以有多个功能,用逗号分隔 )id qxadmin 功能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字段
解决方案 »
- c# odp oracleblob效率太低
- oracle语句在jdbc中报错的问题
- Oracle与sqlserver数据类型对应
- 重求sql
- 数据库导入问题。
- 求,高效率创建索引的方法
- 我用PL\SQL Developer,怎么Number太长,他总是用科学计数法.有没有办法不这样?
- 这种情况如何考虑并发控制和重号呢??
- 实在不好意思,请问如何在db2中将20020830字符串转换为日期型,或求'20020830'与'20020810'之间的日期天数差
- 如何保持Oracle中两个结构一样的表的数据同步或一致
- 请教一个 Oralce 的任务调度的问题,万分感谢!
- 按B列相邻分组取A列最大行,并求分组后A的最大最小差,该如何实现呢?
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
v_typeid := substr(v_instr, 1,
case when instr(v_instr, ',') > 0 then instr(v_instr, ',') - 1 else length(v_instr) end);
begin
select nvl(nr, 'unknow') into v_typename
from tba
where dm = v_typeid;
exception
when no_data_found then
v_typename := 'unknow';
end;
v_result := v_result || v_typename || ',';
exit when instr(v_instr, ',') = 0 or v_instr is null;
v_instr := substr(v_instr, instr(v_instr, ',') + 1);
end loop;
v_result := substr(v_result, 1, length(v_result) - 1);
return(v_result);
end fn_convertcode;
1) 先看一下字典表的最大数据(如果大的话放弃这个方法),按字典表一个一个分割后用union all 连起来select id, substr(qx || ',', 1, instr(qx || ',', ',') - 1)
from user
union all
select id,
substr(replace(qx || ',',
substr(qx || ',', 1, instr(qx || ',', ',')),
''),
1,
instr(replace(qx || ',',
substr(qx || ',', 1, instr(qx || ',', ',')),
''),
',') - 1)
from user
union all
...
;
2)自定义函数分割,这个楼上几位已经有答案了。