在拼接的字符串中根据代码显示名称

    实际项目中,经常会出现这样一种设计。例如,一张项目表,有个项目负责人的字段,而项目和负责人出现一对多的关系。本来规范来说,应该建一张项目与负责人的关系表,但是很多时候,会直接采用多个项目负责人之间用逗号隔开存进这个字段的做法。如果存的是ID,查询时需要将对应的人带出来怎么办


    借用帖子中的例子 http://bbs.csdn.net/topics/391023423?page=1#post-399141457


    比较简单的是使用wm_concat函数

SELECT OID,(
SELECT wm_concat(b.zone_code||'-'||b.zone_name) FROM tableb b WHERE ','||a.zone_code||',' LIKE '%,'||b.zone_code||',%'
)zone_name
FROM tablea a;

    但是,wm_concat并不保证顺序,排列顺序和执行计划有关系。可以采用下面的做法

SELECT OID,
       (SELECT SUBSTR(MAX(SYS_CONNECT_BY_PATH(B.ZONE_CODE || '-' ||
                                              B.ZONE_NAME,
                                              ',')),
                      2)
          FROM TABLEB B
         START WITH B.ZONE_CODE =
                    SUBSTR(A.ZONE_CODE,
                           1,
                           INSTR(A.ZONE_CODE || ',', ',', 1, 1) - 1)
        CONNECT BY B.ZONE_CODE =
                   SUBSTR(A.ZONE_CODE,
                          INSTR(',' || A.ZONE_CODE, ',', 1, LEVEL),
                          INSTR(A.ZONE_CODE || ',', ',', 1, LEVEL) -
                          INSTR(',' || A.ZONE_CODE, ',', 1, LEVEL))) ZONE_NAME
  FROM TABLEA A;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值