当你在开发会员系统时,必然会碰着在一个字段中,用逗号或其他符号分隔存储多个信息的情形。例如:保留某个用户的一对多权限时,在权限组这个字段中,就会以逗号分隔保留多个权限编号。
$ c! W. d. B# D+ f 那么,此刻假设给出某一个权限编号,要去检索出包含这个权限的所有用户记实集结,该怎么去写这个sql语句呢?剖析:这时就需要在逗号分隔的多个权限编号字段中去匹配给出的这个权限编号。如不美观使用like去做,一则效率不高,二则匹配不切确。是以用到了逗号分隔列转行的体例。今朝该体例只适合在Oracle数据库中使用。该体例只需要sql语句就可以实现列转行。: C8 {7 ~1 ]# a1 i
下面给出该体例的示例:% } @2 g* |" p$ k
select a,b,c from" U" G' |7 G8 t2 i. {6 F) F
(with test as (select 'aaa' a,'bbb' b,'1,2,3' c from dual)* N+ U1 s; c E' g$ O. o
select a,b,substr(t.ca,instr(t.ca, ',', 1, c.lv) + 1,instr(t.ca, ',', 1, c.lv + 1) - (instr(t.ca, ',', 1, c.lv) + 1)) AS c
3 r4 r4 r6 p9 S& u1 f: l& f from (select a,b,',' || c || ',' AS ca,length(c || ',') - nvl(length(REPLACE(c, ',')), 0) AS cnt FROM test) t,+ y# ?6 \) R/ U* J# I2 c8 d. I" u9 F
(select LEVEL lv from dual CONNECT BY LEVEL |