2

departments列を持つ名前のテーブルがあります-

id number(10)
description varchar2(20)

そして、filters列で呼び出される構成テーブル-

filtername varchar2(10)
filter varchar2(20)

列には、「10,20,30」などfilter、句でフィルタとして使用する ID のリストを含める必要があります。where

select * 
 from departments
    , filters 
where filters.filtername='MYFILTE' 
  and departments in filters.filter

フィルターごとに 1 つのレコードしか使用できません。これは可能ですか?

4

2 に答える 2

2
select * 
 from departments d 
where id in (select regexp_substr(filter,'[^,]+', 1, level) from filters
               where filtername='MYFILTE' --use this line if you only want to use one filter, remove if you want to apply all filters
             connect by regexp_substr(filter, '[^,]+', 1, level) is not null);

A table like this -

create table filters (filter varchar2(100), filtername varchar2(20));

With data like this-

insert into filters values ('10,20,30','Filter1');
insert into filters values ('40,50,60','Filter2');

Run the query like this (assuming column filter has values separated by ,)-

select distinct regexp_substr(filter,'[^,]+', 1, level) from filters
connect by regexp_substr(filter, '[^,]+', 1, level) is not null
order by 1;

Returns this-

REGEXP_SUBSTR(FILTER,'[^,]+',1,LEVEL)
-----------------------------------------
10
20
30
40
50
60 

Note- Neither the distinct nor the order by matters in your case (i.e. not required in your query, but you can use them anyway).

于 2012-09-11T19:39:43.040 に答える
0

これは単純な結合によって達成されます:)

select * 
from departments d
join filters f on d.description = f.filter
where f.filtername='MYFILTE' 

編集: f.filter が値を持つコンマ区切りの文字列であることを見逃していました。その場合、2 つのオプションがあります。

次のように使用します。

select * 
from departments d
join filters f on f.filter like '%'||d.description||'%'
where f.filtername='MYFILTE' 

または独自の爆発機能を使用します。

CREATE OR REPLACE TYPE DM.varchar_list_type as table of varchar2(255);

CREATE OR REPLACE function explode(p_separator in varchar2, p_string in varchar2)
return varchar_list_type 
as
   l_string   varchar2(4000) default p_string || p_separator;
   l_data     varchar_list_type := varchar_list_type();
   n          number;
begin
   loop
      exit when l_string is null;
      n := instr (l_string, p_separator);
      l_data.extend;
      l_data (l_data.count) := ltrim (rtrim (substr (l_string, 1, n - 1)));
      l_string := substr (l_string, n + 1);
   end loop;

   return l_data;
-- no exception. I want to see the error messages (for now at least)
end;

select * 
from departments d
join filters f on d.description in (table(explode(',', f.filter)))
where f.filtername='MYFILTE' 
于 2012-09-11T21:32:12.237 に答える