今天在无意间查询到一个SQL,有两张表,一张用户表,用户表中有个personroles字段,CLOB类型,里面是逗号分隔的角色id(A,B,C,D),需要查询每个人和其现有的角色。问题在于用户表和角色表的关联,直接left join用roles.id in (user.personroles),查询不出来,最后看到了ORACLE中有个函数instr
instr()函数的格式 (俗称:字符查找函数)
格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串)
格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] ) / instr(源字符串, 目标字符串, 起始位置, 匹配序号)
解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。
最终写出的sql如下:
select a.chinaname,
a.personroles,
wm_concat(b.chinaname)
from sys_user a
join sys_roles b
on instr(\’,\’ || to_char(a.personroles) || \’,\’, \’,\’ || b.id || \’,\’) > 0
where a.delstatus = 0
group by a.chinaname, a.personroles;
查询结果正确。