0

理想的には、これをクエリ内に保持したいのですが、それが不可能な場合は、操作する webapp レベルがないため、パッケージが機能すると思います。

私がやりたいのは、Oracle DBの場合、whereすべての行にワイルドカードを含む部分文字列が格納されている1つの属性を持つテーブルの各行に対して、検索文字列に追加するように、句でクエリを作成/実行することですのためにcontains。私の知る限り、クエリ内で実際にループを実行することはできないため、カーソルが必要になりますが、カーソルを使用したことはありません。これは、私がやろうとしていることをより視覚的に表現したものです(ループロジックを使用して):

Table1
属性: 名

ジョン・
ジョー・
ジェーン・
ジョセフィン

Table2
属性: 部分文字列

%se%
%h%i%

制約により、常に少なくとも 1 つの行が保証されている場合

疑似クエリ

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

( SQL に "LIKE" と "IN" の組み合わせはありますか? にCONTAINS基づく構文)

4

2 に答える 2

0

コレクションマルチセットキャストの使用に基づくいくつかのバリアント(質問の私の理解によると):

SQLフィドル

パターンが一致するすべての文字列:

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 に答える