读书人

ORACLE 的SPLIT解决方案

发布时间: 2013-08-01 15:23:18 作者: rapoo

ORACLE 的SPLIT
表A有一个字段vertype,存储的值01,02,03;对应表B(vertype,vervalue):01为手机,02为电话,03为电脑;
如何写一个函数让页面展示vertype的时候,如果vertype为01,页面展示位手机;如果为01,02;页面展示为:手机,电话。求指导
[解决办法]
我做过类似的,不过我的编码是固定长度的。
先 len(str)-len(replace,',','') 算出一共几个逗号
然后 loop
用substr(currlen,currlen+2*i)。
[解决办法]


s1 := ','
[解决办法]
'01,02,03'
[解决办法]
',';
for c in select * from B where s1 like '%,'
[解决办法]
vertype
[解决办法]
',%'
loop
s1 := replace(s1,','
[解决办法]
c.vertype
[解决办法]
',' , ','
[解决办法]
c.vervalue
[解决办法]
',');
end loop;
s1 := substr(s1, 2, length(s1)-2);

[解决办法]
引用:
表A有一个字段vertype,存储的值01,02,03;对应表B(vertype,vervalue):01为手机,02为电话,03为电脑;
如何写一个函数让页面展示vertype的时候,如果vertype为01,页面展示位手机;如果为01,02;页面展示为:手机,电话。求指导


前面两个with是模拟数据,后面的是查询结果。

首先使用笛卡尔积,制造结果集,然后利用01,02,03是否在前面的vertype中作为过滤条件,最后使用Oracle的WMSYS.WM_CONCAT函数来归集结果。


WITH a AS(
SELECT '01,' AS vertype FROM dual UNION
SELECT '01,02' AS vertype FROM dual UNION
SELECT '01,02,03' AS vertype FROM dual UNION
SELECT '01,03' AS vertype FROM dual


),b AS(
SELECT '01' AS vertype,'手机' AS vervalue FROM dual UNION
SELECT '02' AS vertype,'电话' AS vervalue FROM dual UNION
SELECT '03' AS vertype,'电脑' AS vervalue FROM dual
)
SELECT A.VERTYPE, WMSYS.WM_CONCAT(VERVALUE) AS RESULT
FROM A, B
WHERE INSTR(A.VERTYPE, B.VERTYPE) > 0
GROUP BY A.VERTYPE;



结果:
01,手机
01,02手机,电话
01,02,03手机,电脑,电话
01,03手机,电脑
[解决办法]
引用:
我需要在SQL语句用函数做处理,在代码里做判断处理太麻烦,不方便


如果第二章表的处理项比较简单的话,比如只有三个选择的话,可以借鉴行转列的处理思路


WITH a AS(
SELECT '' AS vertype FROM dual UNION
SELECT '01,' AS vertype FROM dual UNION
SELECT '01,02' AS vertype FROM dual UNION
SELECT '01,02,03' AS vertype FROM dual UNION
SELECT '01,03' AS vertype FROM dual
),b AS(
SELECT '01' AS vertype,'手机' AS vervalue FROM dual UNION
SELECT '02' AS vertype,'电话' AS vervalue FROM dual UNION
SELECT '03' AS vertype,'电脑' AS vervalue FROM dual
)
SELECT VERTYPE,D01
[解决办法]
D02
[解决办法]
D03 FROM
( SELECT A.VERTYPE,
CASE WHEN instr(vertype,'01')>0 THEN '手机' END AS D01,
CASE WHEN instr(vertype,'02')>0 THEN '电话' END AS D02,
CASE WHEN instr(vertype,'03')>0 THEN '电脑' END AS D03
FROM a
);


01,手机
01,02手机电话
01,02,03手机电话电脑
01,03手机电脑

[解决办法]
function f(s0 varchar2) is
s1 varchar2(128);


begin
s1 := ','
[解决办法]
s0
[解决办法]
','; --',01,02,03,'; 加逗号保证分隔
for c in select * from B where s1 like '%,'
[解决办法]
vertype
[解决办法]
',%'
loop
--这么麻烦的替换是为了保证顺序,否则按照楼上的WM_CONCAT就直接出来了。
s1 := replace(s1,','
[解决办法]
c.vertype
[解决办法]
',' , ','
[解决办法]
c.vervalue
[解决办法]
',');
end loop;
s1 := substr(s1, 2, length(s1)-2); --去除两端逗号
return s1;
end f;

select vertype, f(vertype) from A;

读书人网 >oracle

热点推荐