0

因此,理想情况下,我想将其保留在查询中,但如果不可能,我想一个包可以工作,因为我没有 webapp 级别可以使用。

我想做的是,对于Oracle DB,在where子句中创建/运行查询,以便对于具有一个属性的表中的每一行,其中所有行都有带有通配符的子字符串,它会添加到搜索字符串中为contains. 因为据我所知,您不能真正在查询中执行循环,因此需要一个游标,但我从未使用过游标。这是我正在尝试做的更直观的表示(使用循环逻辑教唆):

表 1
属性:名字

约翰乔简约瑟芬
_


Table2
属性:子字符串

%se%
%h%i%

在约束条件下,保证总是至少有一行

伪查询

SELECT 
  table1.firstname
FROM
  table1
WHERE CONTAINS(table1.firstname, '"table2.row1"
  IF(count(table2.substrings) > 1)
    FOR table2.row = 2 TO count(table2.substrings)
      (
      + " OR row.substrings"
      )
 ', 1) > 0

CONTAINS语法基于SQL中是否有“LIKE”和“IN”的组合?

4

2 回答 2

1

我不确定你想得到什么,但我认为这些简单的例子可能会有所帮助。

select * 
from table1 t1
where exists(
    select 1 from table2 t2
    where t1.firstname like t2.attribute
);


select t1.*,
       ( select listagg( ''''||t2.attribute||'''', ' OR ' ) WITHIN GROUP (order by t2.attribute )
         from table2 t2
         where t1.firstname like t2.attribute
       ) CONTAINS_argument
from table1 t1

这是这些查询的SQLFiddle 演示

于 2013-07-24T19:56:56.000 回答
0

一些变体(根据我对问题的理解),基于集合多集转换的使用:

SQLFiddle

所有具有匹配模式的字符串:

select
  t1.firstname,
  cast( multiset(
    select t2.attribute
    from table2 t2 
    where t1.firstname like t2.attribute
  ) as sys.ODCIVarchar2List)              pattern_list
from 
  table1 t1
;

字符串匹配模式的所有模式:

select 
  t2.attribute,
  cast( multiset(
    select t1.firstname
    from table1 t1 
    where t1.firstname like t2.attribute
  ) as sys.ODCIVarchar2List)               word_list
from
  table2 t2
;

即时构建模式集合:

with table2 as (
  select '%se%' Attribute from dual union
  select '%h%i%' from dual   
)
select
  t1.firstname,
  cast( multiset(
    select t2.attribute
    from table2 t2 
    where t1.firstname like t2.attribute
  ) as sys.ODCIVarchar2List)               pattern_list
from 
  table1 t1;

过滤器仅匹配:

select 
  firstname, 
  (select count(1) from table(pattern_list)) cnt,
  pattern_list
from (
  select
    t1.firstname,
    cast( multiset(
      select t2.attribute
      from table2 t2 
      where t1.firstname like t2.attribute
    ) as sys.ODCIVarchar2List)             pattern_list
  from 
    table1 t1
)
where (select count(1) from table(pattern_list)) > 0;

等等。

于 2013-07-24T21:07:43.737 回答