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);
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;
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
);
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;