最近在项目中,遇到一个用户有多个角色的问题。数据库中保存的是角色编码是多个外键并用逗号分隔的值。需求需要查询出相应的中文值,并且合成一个字段。说明 若表字段有1,2,3 则需要根据1,2,3找出对应 的值a,b,c 组成一个字段。
下面开始实现记录:
1.创建学生表
--1.创建stu表
create table stu(
sid varchar(100) primary key not null,
sname varchar(100),
bid varchar(100)
)
comment on column stu.sid is 'id值';
comment on column stu.sname is '名称';
comment on column stu.bid is '书籍,外键值';
--2.创建书籍表单
create table book(
bid varchar(100) primary key not null,
bname varchar(100),
bprice varchar(100)
)
comment on column book.bid is 'id值';
comment on column book.bname is '书籍名称';
comment on column book.bprice is '书籍价格';
--插入数据
insert into stu values('1','小明','1,2');
insert into stu values('2','小红','1,3');
insert into stu values('3','小强','1,2,3,304');
insert into stu values('4','小威','2,3_4,3-3');
--插入数据,注意此处id 为304的数据
insert into book values('1','数学','12');
insert into book values('2','语文','16');
insert into book values('3','英文','13');
insert into book values('3_4','高中英语','10');
insert into book values('3-3','大学英语','20');
insert into book values('304','小学英语','25');
两边加逗号 ,防止 atesta 匹配 test
-- 例:1.,a,b_c,d 匹配 %,b_c,%
-- 2.,a,b, 匹配 %,a,%
-- 3.,a-b, 匹配 %,a-b,%
1.首先我们写一条sql语句
select s.sid,s.sname,s.bid,
(select listagg(b.bname,',') within group(Order by b.bid) from book b where ',' || s.bid || ',' like '%,' || b.bid || ',%') as bname
from stu s
j1.png
结果如图:1-1
我们可以看看 3_4的模糊查找结果
select * from book b where b.bid like '%3_4%';
j3.png
所以,我们应该避免此处有特殊字符的情况
2.用replace替换_,实现的sql语句
select s.sid,s.sname,s.bid,
(select listagg(b.bname,',') within group(Order by b.bid) from book b where ',' || replace(s.bid,'_','') || ',' like '%,' || replace(b.bid,'_','') || ',%') as bname
from stu s
结果如图:1-2
总结:模糊查找代表一个字符了。3_4可以找到304 ,314、3_4。。。等记录 ,所以查找时首先把替换为'', 准确查找所有记录。
这就是一张表字段有多个外键值,查找的方法记录。
ly_dv 一个小菜鸟
网友评论