新人求助:orac表中某个字段的值是用逗号隔开的,我select时要分别替换掉,SQL怎么写啊?

Alicemei550 2015-08-24 10:10:42
orac表中某个字段的值是用逗号隔开的,我select时要分别替换掉,SQL怎么写啊?
例如一个表A里的字段a是(1,2,3,4,5),另一个表B是
序号 姓名
1 张三
2 李四
3 王五
4 李伟
5 小明
6 姗姗
7 丽丽
8 佳佳
我在select时,想要让表A里的字段a筛选出的是(张三,李四,王五,李伟,小明),要怎么写SQL语句?
...全文
357 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
滇中倦客 2015-08-29
  • 打赏
  • 举报
回复
我帮楼主把逗号隔开数据变成了多行,再与楼主的表关联即可 ,代码如下,如果有上万行的话可能性能会慢:

with T as
(select 1 id, '张三,李四,王五' name from dual
union all
select 2, '赵六,邹七' from dual
union all
select 3, '周八' from dual)
SELECT id, REGEXP_SUBSTR(T.name, '[^,]+', 1, rn) as name
FROM T,(SELECT rownum rn FROM dual CONNECT BY rownum <= (
select LENGTH(name) - LENGTH(REPLACE(name, ','))+1 from (select wm_concat(name) name from T)
)) b
WHERE
LENGTH(name) - LENGTH(REPLACE(name, ','))+1 >= rn
mayanzs 2015-08-27
  • 打赏
  • 举报
回复
select A.a,(select wm_concat(B.name) from B where A.a like '%'||B.name||'%') name_h from A;
Alicemei550 2015-08-26
  • 打赏
  • 举报
回复
引用 1 楼 mayanzs 的回复:
select * from B where (select a from A where ...) like '%'||id||'%'; 注: where ... 是确定从A表中取出唯一记录的条件语句 ,如 where a='1,2,3,4,5'
这个如果要批量处理该怎么办啊,那可是几千条记录啊
shixin14 2015-08-26
  • 打赏
  • 举报
回复
11g的话,这个应该可以

SQL> with A as ( select '(1,2,3,4,5)' a from dual),
  2       B as ( select '1' no, '张三' name from dual
  3    union all select '2' no, '李四' name from dual
  4    union all select '3' no, '王五' name from dual
  5    union all select '4' no, '李伟' name from dual
  6    union all select '5' no, '小明' name from dual
  7    union all select '6' no, '姗姗' name from dual
  8    union all select '7' no, '丽丽' name from dual
  9    union all select '8' no, '佳佳' name from dual
 10  ),
 11  C as ( select
 12         instr( ','|| substr(A.a,2,length(A.a)-2) || ',' , ','|| B.no || ',') ind,
 13         B.name
 14         from A, B
 15         where instr( ','|| substr(A.a,2,length(A.a)-2) || ',' , ','|| B.no || ',') > 0
 16  )
 17  select '('|| listagg(C.name,',') within group (order by C.ind)  || ')' from C ;
'('||LISTAGG(C.NAME,',')WITHIN
--------------------------------------------------------------------------------
(张三,李四,王五,李伟,小明)

SQL> 
Alicemei550 2015-08-25
  • 打赏
  • 举报
回复
我那个举例真的只是个例子,实际上,我要操作的表B有近两万条记录,而且A表的那个字段也绝对不只5个,请问有没有可以批量处理的方法?
LongRui888 2015-08-24
  • 打赏
  • 举报
回复
试试这个:
select B.*
from B
inner join A 
        on ',' || cast(A.序号 as varchar2(20)) ||',' like '%,' || A.a  ||',%'
陈灬风 2015-08-24
  • 打赏
  • 举报
回复
select regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(字段a, 1, '张三'), 2, '李四'), 3, '王五'), 4, '李伟'), 5, '小明'), 6, '姗姗'), 7, '丽丽', 8, '佳佳') as 字段a from 表A;
陈灬风 2015-08-24
  • 打赏
  • 举报
回复
引用 2 楼 chenfeng1122 的回复:
select regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(字段a, 1, '张三'), 2, '李四'), 3, '王五'), 4, '李伟'), 5, '小明'), 6, '姗姗'), 7, '丽丽', 8, '佳佳') as 字段a from 表A;
是这个 select regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(regexp_replace(字段a, 1, '张三'), 2, '李四'), 3, '王五'), 4, '李伟'), 5, '小明'), 6, '姗姗'), 7, '丽丽'), 8, '佳佳') as 字段a from 表A;
chengccy 2015-08-24
  • 打赏
  • 举报
回复
1.字符串转行; 2.表关联; 3.行转字符串;
mayanzs 2015-08-24
  • 打赏
  • 举报
回复
select * from B where (select a from A where ...) like '%'||id||'%'; 注: where ... 是确定从A表中取出唯一记录的条件语句 ,如 where a='1,2,3,4,5'

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧