最近在項(xiàng)目中扛或,遇到一個(gè)用戶有多個(gè)角色的問(wèn)題。數(shù)據(jù)庫(kù)中保存的是角色編碼是多個(gè)外鍵并用逗號(hào)分隔的值碘饼。需求需要查詢出相應(yīng)的中文值熙兔,并且合成一個(gè)字段悲伶。說(shuō)明 若表字段有1,2,3 則需要根據(jù)1,2,3找出對(duì)應(yīng) 的值a,b,c 組成一個(gè)字段。
下面開(kāi)始實(shí)現(xiàn)記錄:
1.創(chuàng)建學(xué)生表
--1.創(chuàng)建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 '書(shū)籍住涉,外鍵值';
--2.創(chuàng)建書(shū)籍表單
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 '書(shū)籍名稱';
comment on column book.bprice is '書(shū)籍價(jià)格';
--插入數(shù)據(jù)
insert into stu values('1','小明','1,2');
insert into stu values('2','小紅','1,3');
insert into stu values('3','小強(qiáng)','1,2,3,304');
insert into stu values('4','小威','2,3_4,3-3');
--插入數(shù)據(jù)麸锉,注意此處id 為304的數(shù)據(jù)
insert into book values('1','數(shù)學(xué)','12');
insert into book values('2','語(yǔ)文','16');
insert into book values('3','英文','13');
insert into book values('3_4','高中英語(yǔ)','10');
insert into book values('3-3','大學(xué)英語(yǔ)','20');
insert into book values('304','小學(xué)英語(yǔ)','25');
兩邊加逗號(hào) ,防止 atesta 匹配 test
-- 例:1.,a,b_c,d 匹配 %,b_c,%
-- 2.,a,b, 匹配 %,a,%
-- 3.,a-b, 匹配 %,a-b,%
1.首先我們寫(xiě)一條sql語(yǔ)句
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
結(jié)果如圖:1-1
我們可以看看 3_4的模糊查找結(jié)果
select * from book b where b.bid like '%3_4%';
所以舆声,我們應(yīng)該避免此處有特殊字符的情況
2.用replace替換_花沉,實(shí)現(xiàn)的sql語(yǔ)句
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
結(jié)果如圖:1-2
總結(jié):模糊查找代表一個(gè)字符了。3_4可以找到304 纳寂,314主穗、3_4。毙芜。忽媒。等記錄 ,所以查找時(shí)首先把替換為'', 準(zhǔn)確查找所有記錄。
這就是一張表字段有多個(gè)外鍵值腋粥,查找的方法記錄晦雨。
ly_dv 一個(gè)小菜鳥(niǎo)