在 Oracle PLSQL 中使用子文本搜索文本
search in text using subtext in Oracle PLSQL
我在 master_t table 中有这个查询,其中包含 ration_category 列和扇区列中的许多扇区,例如 'BN:INS' 或 'BN' 或'BN:IM:INS' 等..
select distinct ratio_category d from master_t
where status = 'Y' and (SECTORS = :P23_SECTORS or
(INSTR(':'||:SECTORS ||':',:P23_SECTORS)>0 OR UPPER(:P23_SECTORS) = 'ALL')) order by ratio_category
P23_SECTORS= 'BN:INS'
SECTORS='INS:MFI:SB:BN'
: is a separator of multi data
我需要检查 P23_sectors 中的数据是否存在于 SECTORS 变量中,
但是这个查询没有得到数据,因为多数据分隔符
是否可以调整查询以便我可以比较潜台词和全文
注意:顺序不同。
预期输出:
二
聚丙烯
抄送
谢谢
这是一个选项(阅读代码中的注释):
SQL> with master_t (ratio_category, sectors) as
2 -- sample data
3 (select 1, 'INS:MFI:SB:BN' from dual union all
4 select 2, 'BN:LF' from dual
5 ),
6 split_t as
7 -- split SECTORS into rows
8 (select ratio_category,
9 sectors,
10 regexp_substr(sectors, '[^:]+', 1, column_value) sec
11 from master_t cross join
12 table(cast(multiset(select level from dual
13 connect by level <= regexp_count(sectors, ':') + 1
14 ) as sys.odcinumberlist))
15 ),
16 split_23 as
17 -- split P23_SECTORS into rows
18 (select regexp_substr('&&P23_SECTORS', '[^:]+', 1, level) sec,
19 regexp_count('&&P23_SECTORS', ':') + 1 cnt
20 from dual
21 connect by level <= regexp_count('&&P23_SECTORS', ':') + 1
22 )
23 -- return rows that contain complete P23_SECTORS value(s)
24 select t.ratio_category, t.sectors
25 from split_t t join split_23 s on s.sec = t.sec
26 group by t.ratio_category, t.sectors
27 having count(*) = max(s.cnt);
Enter value for p23_sectors: BN:INS
RATIO_CATEGORY SECTORS
-------------- -------------
1 INS:MFI:SB:BN
SQL>
注意人们发表的评论。他们确实有丰富的编程经验,您更愿意听听他们的意见,并感谢他们花时间检查您的问题。你对埃德的回复相当粗鲁;如果我是 Ed,我会确保不会回答您以后的任何问题(阅读:我会让您解决自己的问题)。
我在 master_t table 中有这个查询,其中包含 ration_category 列和扇区列中的许多扇区,例如 'BN:INS' 或 'BN' 或'BN:IM:INS' 等..
select distinct ratio_category d from master_t
where status = 'Y' and (SECTORS = :P23_SECTORS or
(INSTR(':'||:SECTORS ||':',:P23_SECTORS)>0 OR UPPER(:P23_SECTORS) = 'ALL')) order by ratio_category
P23_SECTORS= 'BN:INS'
SECTORS='INS:MFI:SB:BN'
: is a separator of multi data
我需要检查 P23_sectors 中的数据是否存在于 SECTORS 变量中, 但是这个查询没有得到数据,因为多数据分隔符
是否可以调整查询以便我可以比较潜台词和全文 注意:顺序不同。
预期输出: 二 聚丙烯 抄送
谢谢
这是一个选项(阅读代码中的注释):
SQL> with master_t (ratio_category, sectors) as
2 -- sample data
3 (select 1, 'INS:MFI:SB:BN' from dual union all
4 select 2, 'BN:LF' from dual
5 ),
6 split_t as
7 -- split SECTORS into rows
8 (select ratio_category,
9 sectors,
10 regexp_substr(sectors, '[^:]+', 1, column_value) sec
11 from master_t cross join
12 table(cast(multiset(select level from dual
13 connect by level <= regexp_count(sectors, ':') + 1
14 ) as sys.odcinumberlist))
15 ),
16 split_23 as
17 -- split P23_SECTORS into rows
18 (select regexp_substr('&&P23_SECTORS', '[^:]+', 1, level) sec,
19 regexp_count('&&P23_SECTORS', ':') + 1 cnt
20 from dual
21 connect by level <= regexp_count('&&P23_SECTORS', ':') + 1
22 )
23 -- return rows that contain complete P23_SECTORS value(s)
24 select t.ratio_category, t.sectors
25 from split_t t join split_23 s on s.sec = t.sec
26 group by t.ratio_category, t.sectors
27 having count(*) = max(s.cnt);
Enter value for p23_sectors: BN:INS
RATIO_CATEGORY SECTORS
-------------- -------------
1 INS:MFI:SB:BN
SQL>
注意人们发表的评论。他们确实有丰富的编程经验,您更愿意听听他们的意见,并感谢他们花时间检查您的问题。你对埃德的回复相当粗鲁;如果我是 Ed,我会确保不会回答您以后的任何问题(阅读:我会让您解决自己的问题)。