1. 程式人生 > 實用技巧 >oracle 把一行用特殊符號分隔變為多行

oracle 把一行用特殊符號分隔變為多行

首先建立測試資料

-- Create table
create table UF_PQJZB
(
  id                     INTEGER not null,
  requestid              INTEGER,
  pqmc                   VARCHAR2(100),
  sszq                   INTEGER,
  sfyx                   INTEGER,
  formmodeid             INTEGER,
  modedatacreater        INTEGER,
  modedatacreatertype    
INTEGER, modedatacreatedate VARCHAR2(10), modedatacreatetime VARCHAR2(8), modedatamodifier INTEGER, modedatamodifydatetime VARCHAR2(100), modeuuid VARCHAR2(100), modelableid VARCHAR2(200), pqbm VARCHAR2(99), qdbls INTEGER
, pqdd CLOB ) tablespace ECOLOGY pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ); -- Create/Recreate indexes create index UF_IND_1595982945177 on UF_PQJZB (MODEUUID) tablespace ECOLOGY pctfree 10 initrans
2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table UF_PQJZB add primary key (ID) using index tablespace ECOLOGY pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );

插入資料

insert into uf_pqjzb (ID, AA)
values (57, '5120,4940');

sql顯示

SELECT * FROM 
(
with t AS (
SELECT id,to_char(pqdd) AS aa from uf_pqjzb WHERE pqdd IS NOT NULL AND ID ='57' 
)
select ID,regexp_substr(aa, '[^,]+', 1, level) cc
 
from t
 
connect by level <= regexp_count(aa, '\,\') + 1
 
and aa = prior aa
 
and prior dbms_random.value > 0
)

結果顯示

最後我們可以學一個行轉列函式

根據id合併

SELECT ID , LISTAGG(cc, ',') WITHIN GROUP (ORDER BY ID)
  FROM (SELECT * FROM 
(
with t AS (
SELECT id,to_char(pqdd) AS aa from uf_pqjzb WHERE pqdd IS NOT NULL AND ID ='57' 
)
select ID,regexp_substr(aa, '[^,]+', 1, level) cc
 
from t
 
connect by level <= regexp_count(aa, '\,\') + 1
 
and aa = prior aa
 
and prior dbms_random.value > 0
))
 GROUP BY ID;

結果

好了,當然也可以用WM_CONCAT函式

但是一定要注意WM_CONCAT轉換為是clob欄位需要注意