假设一张表叫做课本,主键为课本名称,有一个字段为语言,格式为“中文,英文,德文”,现在想查询所有课本具有的语言,举例
表数据:课本名称 语言线性代数 英语,中文
数据结构 中文
离散数学 中文,德文,日语我现在想得到的结果为:
英文
中文
德文
日语或者 ‘英语,中文,德文,日语’这样也可以。麻烦大虾指教一下,我想了一会儿,没有头绪,请教大家了。
表数据:课本名称 语言线性代数 英语,中文
数据结构 中文
离散数学 中文,德文,日语我现在想得到的结果为:
英文
中文
德文
日语或者 ‘英语,中文,德文,日语’这样也可以。麻烦大虾指教一下,我想了一会儿,没有头绪,请教大家了。
from book;还得做一下处理;
--------------------
LANG
------------------------------------------------------------------------------------------------------------------------
a
english, chineseb
chinesec
chinese, gam, jap
scott@ORA1> with t as (
2 select wmsys.wm_concat(lang) label
3 from book
4 )
5 select distinct *
6 from
7 (
8 select trim(substr(label
9 ,instr(label, ',', 1, rn) + 1
10 ,instr(label, ',', 1, rn + 1) - instr(label, ',', 1, rn) - 1
11 )
12 ) label
13 from
14 (
15 --笛卡尔积
16 select ',' || t1.label || ',' as label, x.rn
17 from t t1, (
18 --这里构成一个序列
19 select rownum rn
20 from (
21 select max(length(label) - length(replace(label, ','))) + 2 comma_cnt --逗号的数量
22 from t
23 )
24 connect by rownum <= comma_cnt
25 ) x
26 )
27 )
28 where label is not null;LABEL
------------------------------------------------------------------------------------------------------------------------
english
chinese
jap
gam
--替换这个里
select wmsys.wm_concat(lang) label
from book
)
select distinct *
from
(
select trim(substr(label
,instr(label, ',', 1, rn) + 1
,instr(label, ',', 1, rn + 1) - instr(label, ',', 1, rn) - 1
)
) label
from
(
--笛卡尔积
select ',' || t1.label || ',' as label, x.rn
from t t1, (
--这里构成一个序列
select rownum rn
from (
select max(length(label) - length(replace(label, ','))) + 2 comma_cnt --逗号的数量
from t
)
connect by rownum <= comma_cnt
) x
)
)
where label is not null