oracle 如何将一个字段里的值拆分为多个值显示出来
如何将一个字段里的值拆分为多个值显示出来表a字段有IDNAME:IDNAME1AA,BB,CC2DD,EE3FF,GG,RR,QQ想要的效果:IDNAME1AA1BB1C...
如何将一个字段里的值拆分为多个值显示出来
表 a 字段 有 ID NAME:
ID NAME
1 AA,BB,CC
2 DD,EE
3 FF,GG,RR,QQ
想要的效果:
ID NAME
1 AA
1 BB
1 CC
2 DD
2 EE
......
有大神会的没 急需谢谢了 展开
表 a 字段 有 ID NAME:
ID NAME
1 AA,BB,CC
2 DD,EE
3 FF,GG,RR,QQ
想要的效果:
ID NAME
1 AA
1 BB
1 CC
2 DD
2 EE
......
有大神会的没 急需谢谢了 展开
5个回答
展开全部
with temp as
(
select name as text from a
)
select substr(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1) text from
(
select ','||t1.text||',' text,t2.rn from
(select text,length(text)-length(replace(text,',',''))+1 rn from temp) t1,
(select rownum rn from all_objects where rownum <= (select max(length(text)-length(replace(text,',',''))+1) rn from temp)) t2
where t1.rn >= t2.rn order by text,rn
)
用这种方法可以处理name这一列,如果你想ID、NAME都先显示的话,就要写成一个函数来调用了。
(
select name as text from a
)
select substr(text,instr(text,',',1,rn)+1,instr(text,',',1,rn+1)-instr(text,',',1,rn)-1) text from
(
select ','||t1.text||',' text,t2.rn from
(select text,length(text)-length(replace(text,',',''))+1 rn from temp) t1,
(select rownum rn from all_objects where rownum <= (select max(length(text)-length(replace(text,',',''))+1) rn from temp)) t2
where t1.rn >= t2.rn order by text,rn
)
用这种方法可以处理name这一列,如果你想ID、NAME都先显示的话,就要写成一个函数来调用了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个一条SQL我没实现过,
原来项目中遇到过类似的需求,也是在网上找的,这么解决的
首先建立一个type
CREATE OR REPLACE TYPE "TY_STR_SPLIT" IS TABLE OF VARCHAR2 (4000);
然后建立一个函数
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split
--功能描述:用指定分隔符切割输入的字符串,返回一维数组,每个数组元素为一个子串。
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_str_split ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
str_split.EXTEND;
str_split (str_split.COUNT) := str;
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
然后使用查询TABLE函数
SELECT * FROM TABLE (CAST (fn_split ('a,b,c', ',') AS ty_str_split ) );
可以达到类似的效果。
原来项目中遇到过类似的需求,也是在网上找的,这么解决的
首先建立一个type
CREATE OR REPLACE TYPE "TY_STR_SPLIT" IS TABLE OF VARCHAR2 (4000);
然后建立一个函数
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split
--功能描述:用指定分隔符切割输入的字符串,返回一维数组,每个数组元素为一个子串。
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_str_split ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
str_split.EXTEND;
str_split (str_split.COUNT) := str;
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
然后使用查询TABLE函数
SELECT * FROM TABLE (CAST (fn_split ('a,b,c', ',') AS ty_str_split ) );
可以达到类似的效果。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得这种存储后展现方式违反数据库设计范式了。
更多追问追答
追问
那先不考虑主键 就一个 NAME 字段 数据是上述的形式, 语句该怎么写
追答
违反设计范式就用sql实现不了啊,你的展现方式想法不对。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
id 是主键么?是主键能那么整吗?
更多追问追答
追问
是主键, 关键 我现在就是想 要把这个拆开多行显示 ,那要不是主键该怎么弄
追答
一张table里面不存在主键,是不健全的
主键具有唯一特性
你那么弄明显不合理,更不符合逻辑
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询