table有两个字段code、name
--------------------------
---code--------------name----------
--10000--------------小张----------
--20000------------小李,小陈-------
--30000-----------小王,小周,小米---code字段是数字,name字段是名字,有可能是一个或多个,多个的时候用逗号分隔。
现在要的查询结果是:如果name有多个的话,分成多条记录。
比如按上面的数据,结果就是:
10000---小张
20000---小李
20000---小陈
30000---小王
30000---小周
30000---小米
查出这样的六条数据来,sql该怎么写呢,数据库是oracle
--------------------------
---code--------------name----------
--10000--------------小张----------
--20000------------小李,小陈-------
--30000-----------小王,小周,小米---code字段是数字,name字段是名字,有可能是一个或多个,多个的时候用逗号分隔。
现在要的查询结果是:如果name有多个的话,分成多条记录。
比如按上面的数据,结果就是:
10000---小张
20000---小李
20000---小陈
30000---小王
30000---小周
30000---小米
查出这样的六条数据来,sql该怎么写呢,数据库是oracle
)
SELECT a,SUBSTR(b, SP, EP - SP) STR
FROM (SELECT a,
b,
INSTR(b, ',', 1, ROWNUM) + 1 SP,
INSTR(b, ',', 1, ROWNUM + 1) EP
FROM n
CONNECT BY ROWNUM < 100)
WHERE EP > 0
select 10000 code,'小张' name from dual union all
select 20000 code,'小李,小陈' name from dual union all
select 30000 code,'小王,小周,小米' name from dual)
SELECT code,
substr(NAME,
instr(NAME, ',', 1, lv) + 1,
instr(NAME, ',', 1, lv + 1) - instr(NAME, ',', 1, lv) - 1) NAME
FROM (SELECT DISTINCT LEVEL lv, code, ',' || NAME || ',' NAME
FROM tt
CONNECT BY LEVEL <= length(NAME) - length(REPLACE(NAME, ',')) + 1)
ORDER BY code;