Oracle中从数据字典中查询出多条记录,保存到一个字段中显示出来

来源:互联网 发布:别人域名到期了能买吗 编辑:程序博客网 时间:2024/06/05 15:33

在工作中遇到一个问题,将问题简化为以下内容:

        一个user可以有多个role,角色信息存储在字典表中,根据用户的分类代码fldm(role)找到用户可能拥有的所有的角色,

筛选出自身所拥有的角色,并在一个字段中显示出来。

1.创建一个t_user表,根据用户的编码

create table t_user(
userid number constraint pk_user primary key,
username varchar2(15),
fldm varchar2(15),    ---分类代码
code_num number default 0 check(code_num between 0 and 15) --编码数字(对应于字典表中的编码)
)

2.然后向表t_user中插入数据,如下图所示


3.创建数据字典表t_dictionary

create table t_dictionary(
fldm varchar2(15),   ---分类代码
flmc varchar2(15),   ---分类名称
code number          -- 编码
)

4.向数据字典表中插入角色数据,如下如所示


5.通过如下语句可以完成:

select userid 用户id,username 用户名,
(case when bitand(code_num,1)=1 then(select flmc from t_dictionary where fldm='role'and code=1) ||';'else null end||
case when bitand(code_num,2)=2 then(select flmc from t_dictionary where fldm='role' and code=2) ||';'else null end||
case when bitand(code_num,4)=4 then(select flmc from t_dictionary where fldm='role' and code=4) ||';'else null end||
case when bitand(code_num,8)=8 then(select flmc from t_dictionary where fldm='role' and code=8) ||';'else null end)角色
from t_user

6.查询结果如下图所示:


------------------问题总结:

1.角色名存储在数据字典中,用户可以根据fldm(分类代码)=‘role’   匹配到所有的角色

2.角色的code(代码)以1,2,4,8的方式存储在字典表中,用户可以根据自身的code_num按照二进制按位与(&)或者oracle中的函数bitand(code_num,2^n)=n来判断用户是不是拥有该角色。

3.通过case when 语句可以实现条件的判断,有对应角色的话,就返回角色的名称,否则返回null。

4.通过||符号实现多个角色的拼接,让它们显示在同一个字段中。

5.角色按照code以1,2,4,8 (2^n)的方式存储,可以很方便的使用按位与&进行判断。(推荐以后创建数据字典使用这种方法)

阅读全文
0 0
原创粉丝点击