+ -
当前位置:首页 → 问答吧 → 求解一个SQL解析字符串的问题

求解一个SQL解析字符串的问题

时间:2011-11-01

来源:互联网

有两张表:
一张表TABLE1
ID work_no name
----------------------
1 1000 张三
2 1001 李四
3 1002 王五
另一张表TABLE2
ID WORK_NO
--------------
1 1000,1001
2 1000,1002
3 1001,1002
查询TABLE2的时候希望得到如下结果
1 1000,1001 张三,李四
2 1000,1002 张三,王五
3 1001,1002 李四,王五
想写一个函数来解析TABLE2中的WORK_NO,不知道如何写,请哪位高手指点一下,谢谢
   

作者: a_king   发布时间: 2011-11-01

关注!!!

作者: woaikuihua   发布时间: 2011-11-01

用正则表达式
with table1 as
(select 1 id,'1000' work_no ,'张三' name from dual union all
select 2 id,'1001' work_no ,'李四' name from dual union all
select 3 id,'1002' work_no ,'王五' name from dual 
),
table2 as
(select 1 id,'1000,1001' work_no from dual union all
select 2 id,'1000,1002' work_no from dual union all
select 3 id,'1001,1002' work_no from dual 
)
select a.*
  ,b.name||','||c.name
from table2 a
left join table1 b on regexp_substr(a.work_no,'[^\,]+',1,1)=b.work_no
left join table1 c on regexp_substr(a.work_no,'[^\,]+',1,2)=c.work_no
;

  ID WORK_NO B.NAME||','||C.NAME
---------- --------- -------------------
  1 1000,1001 张三,李四
  3 1001,1002 李四,王五
  2 1000,1002 张三,王五

作者: canhui87   发布时间: 2011-11-01

SELECT LEVEL,
  REGEXP_SUBSTR (
  'first,second,third',
  '[^,]*',
  NVL (REGEXP_INSTR ('first,second,third',
  ',',
  1,
  DECODE (LEVEL - 1, 0, NULL, LEVEL - 1)), 0)
  + 1
  )
  split_result
  FROM DUAL
CONNECT BY NVL (REGEXP_INSTR ('first,second,third',
  ',',
  1,
  DECODE (LEVEL - 1, 0, NULL, LEVEL - 1)), 1) >
  0

作者: tx2730   发布时间: 2011-11-02

具体是要得到同样的结果,还是要写一个函数,调用函数得到最后的结果呢?

作者: LuiseRADL   发布时间: 2011-11-02

SQL code

select table2.id,table2.work_no,wm_concat(table1.name)
from table2 
left join table1 
on instr(table2.work_no,table1.work_no) > 0
group by table2.id,table2.work_no

作者: xiaobn_cn   发布时间: 2011-11-02

引用 5 楼 xiaobn_cn 的回复:
SQL code


select table2.id,table2.work_no,wm_concat(table1.name)
from table2
left join table1
on instr(table2.work_no,table1.work_no) > 0
group by table2.id,table2.work_no

借用下SQL,这样比较严谨
SQL code
select table2.id,table2.work_no,wm_concat(table1.name)
from table2 
left join table1 
on instr(','||table2.work_no||',',','||table1.work_no||',') > 0
group by table2.id,table2.work_no

作者: tx2730   发布时间: 2011-11-02

lz的Oracle是什么版本,函数wm_concat要10g或以上才有,不然要自己写

作者: tx2730   发布时间: 2011-11-02

用 instr 不太合适
考虑一下这种情况
  100 张三
  1000 李四
  1001 王五
 有一条记录 1000,1001 ,进行关联后 【100 张三】 这条数据也会关联上了,bug啊
 

作者: coolkisses   发布时间: 2011-11-02

引用 8 楼 coolkisses 的回复:
用 instr 不太合适
考虑一下这种情况
100 张三
1000 李四
1001 王五
有一条记录 1000,1001 ,进行关联后 【100 张三】 这条数据也会关联上了,bug啊

直接用确实不合适,但是两头都加上','就可以比了,六楼给出了用法

作者: tx2730   发布时间: 2011-11-02

引用 8 楼 coolkisses 的回复:
用 instr 不太合适
考虑一下这种情况
100 张三
1000 李四
1001 王五
有一条记录 1000,1001 ,进行关联后 【100 张三】 这条数据也会关联上了,bug啊


带上分隔符做instr就可以了,这个问题6楼已经解决了。

作者: xiaobn_cn   发布时间: 2011-11-02