ORACLE 的SPLIT

水煮沉浮 2013-07-01 06:22:23
表A有一个字段vertype,存储的值01,02,03;对应表B(vertype,vervalue):01为手机,02为电话,03为电脑;
如何写一个函数让页面展示vertype的时候,如果vertype为01,页面展示位手机;如果为01,02;页面展示为:手机,电话。求指导
...全文
233 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
水煮沉浮 2013-07-24
  • 打赏
  • 举报
回复
谢谢LS的几位的帮忙解惑,我参照着http://1988xuxuxu.iteye.com/blog/1074304,写了一个,调试多次后成功了
shy315 2013-07-23
  • 打赏
  • 举报
回复
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;
陈字文 2013-07-23
  • 打赏
  • 举报
回复
引用 2 楼 q_qqqq 的回复:
我需要在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 手机电脑
陈字文 2013-07-23
  • 打赏
  • 举报
回复
引用 楼主 q_qqqq 的回复:
表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 手机,电脑
水煮沉浮 2013-07-22
  • 打赏
  • 举报
回复
引用 4 楼 shy315 的回复:

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);
可以具体点吗?
水煮沉浮 2013-07-22
  • 打赏
  • 举报
回复
我把情景描述清楚一点吧,请大家给点指导,谢谢。 表A有一个字段vertype,可以为空,有值的话是以01,02(数字间以逗号分隔)形式存储。 表B有字段vertype,vervalue。对应01:手机 ,02:电脑 我希望在对A表做查询的时候,把vertype的对应的中文名称显示出来,如果vertype为空,那么也是的中文名称为空,如果有值,比如为01,02,那么需要显示为:手机,电脑。 =============================这个函数怎么写? 在线等,还望各位大神给予指点啊
水煮沉浮 2013-07-22
  • 打赏
  • 举报
回复
引用 5 楼 sych888 的回复:
自己写个函数吧.......
没写过这样的函数,还望指教
sych888 2013-07-05
  • 打赏
  • 举报
回复
自己写个函数吧.......
shy315 2013-07-04
  • 打赏
  • 举报
回复

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);
光翟 2013-07-02
  • 打赏
  • 举报
回复
我做过类似的,不过我的编码是固定长度的。 先 len(str)-len(replace,',','') 算出一共几个逗号 然后 loop 用substr(currlen,currlen+2*i)。
水煮沉浮 2013-07-01
  • 打赏
  • 举报
回复
我需要在SQL语句用函数做处理,在代码里做判断处理太麻烦,不方便
Wentasy 2013-07-01
  • 打赏
  • 举报
回复
取出数据然后判断不就完了。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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