Oracle行记录合并与拆分

一、多选记录合并
1. 因为网上有各种关于多行记录合并的方案:有直接SQL,有自定义方法等,在此不再介绍;
2. 本人只介绍最偷懒的方法,条件为数据库为oracle 10g,本人比较懒(此次不提供自定义方法)
3. 在oracle 10g以上版本,可以使用以下系统函数 WMSYS.WM_CONCAT(列名),用法如下

SELECT ID, WMSYS.WM_CONCAT(OID) OID FROM TABLE GROUP BY ID

4. 如果为 oracle 10g以下版本,建议使用自定义方法,暂无。
 
二、单行记录拆分
1. 对于单选记录拆分不知道oracle有没有提供系统函数了,在此不纠结此问题;
2. 我们提供自定义的方法,方法如下:
 
CREATE OR REPLACE FUNCTION SPLITSTR(P_STRING IN VARCHAR2,
                                    P_DELIMITER IN VARCHAR2)
  RETURN STR_SPLIT
  PIPELINED AS
  V_LENGTH NUMBER := LENGTH(P_STRING);
  V_START NUMBER := 1;
  V_INDEX NUMBER;
BEGIN
  WHILE (V_START <= V_LENGTH) LOOP
    V_INDEX := INSTR(P_STRING, P_DELIMITER, V_START);
 
    IF V_INDEX = 0 THEN
      PIPE ROW(SUBSTR(P_STRING, V_START));
      V_START := V_LENGTH + 1;
    ELSE
      PIPE ROW(SUBSTR(P_STRING, V_START, V_INDEX - V_START));
      V_START := V_INDEX + 1;
    END IF;
  END LOOP;
 
  RETURN;
END SPLITSTR;
 
3. 用法如下:
    SELECT *
      FROM TABLE (SELECT SPLITSTR(ACTORS, ',') ACTORS
                    FROM WF_NODE
                   WHERE NODEINDEX = 4)

猜你喜欢

转载自qi-w2006.iteye.com/blog/1990684
今日推荐