2013-02-23 74 views
1

我正在嘗試編寫一個Oracle SQL查詢以返回當前配置爲執行作業的一組值。Oracle SQL:僅返回包含在另一個表中的字段中的值

我有兩個表:

VALUES 
A 
B 
C 
D 


JOB, STRINGS_TO_SEARCH 
1 {r, e, 'Hello' A w: B, xyz} 
2 {ok, D } 

每個作業的配置存儲在一個單一的字符串。我將如何編寫一個查詢,該查詢僅返回爲作業配置的值?

這甚至有可能使用內置的Oracle函數嗎?好像我要的可能是要生成一個動態查詢...

+0

不完全理解您的請求。上述數據有什麼期望的結果? – sgeddes 2013-02-23 20:35:46

+0

第三個表存在來自計劃作業的事務記錄。每條記錄都有一個與之相關的值(A,B,C或D)。用戶可以隨時調整調度程序,因此STRINGS_TO_SEARCH可以更改。我計劃使用查詢來識別已安排用於特定作業的特定交易記錄。 – Nitax 2013-02-23 21:00:24

+0

鑑於你的問題中的數據,你想要什麼結果?搜索字符串是如何用逗號或空格分隔的? – 2013-02-23 21:10:57

回答

0
create table T_VALUES (
    VAL varchar2(20) 
); 

insert into T_VALUES values ('A'); 
insert into T_VALUES values ('B'); 
insert into T_VALUES values ('C'); 
insert into T_VALUES values ('D'); 

create table T_JOBS (
    JOB_ID int, 
    STR_LIST varchar2(50) 
); 

insert into T_JOBS values (1, 'r, e, ''Hello'' A w: B, xyz'); 
insert into T_JOBS values (2, 'ok, D '); 

select 
    job_id, 
    val 
from 
    T_VALUES 
    natural join (
     select 
     job_id, 
     regexp_substr(str_list, '[^ ,]+', 1, occ) as val 
     from 
     T_JOBS 
     cross join (
      select level as occ from dual 
      connect by level <= (select max(length(str_list)) from T_JOBS) 
     ) 
    ) 
order by 1, 2 

fiddle


編輯:

改進版(使用Ben的想法)

create table T_VALUES (
    VAL varchar2(20) 
); 

insert into T_VALUES values ('A'); 
insert into T_VALUES values ('B'); 
insert into T_VALUES values ('C'); 
insert into T_VALUES values ('D'); 

create table T_JOBS (
    JOB_ID int, 
    STR_LIST varchar2(50) 
); 

insert into T_JOBS values (1, 'junk, values=A:NotA:B:r:e, more_junk'); 
insert into T_JOBS values (2, 'ok, values=D '); 

create type nt_str as table of varchar2(50); 

select 
    j.job_id, 
    v.val 
from 
    T_JOBS j, 
    table(
     cast(
     multiset(
      select 
      regexp_substr(
       regexp_substr(j.str_list, 'values=([^, ]+)', 1, 1, 'i', 1), 
       '[^:]+', 1, level) 
      from dual 
      connect by 
      regexp_substr(
       regexp_substr(j.str_list, 'values=([^, ]+)', 1, 1, 'i', 1), 
       '[^:]+', 1, level) is not null 
     ) as nt_str 
    ) 
    ) t 
    join T_VALUES v 
    on v.val = t.column_value 
order by 1, 2 

one more fiddle

+0

假設這是正確的方法,你可以改進它;你不需要笛卡爾連接等,如果你通過regexp_substr(str_list,'[^,] +',1,level)連接不爲空',我回答[這裏](http://stackoverflow.com/questions/14459600/search-if-number-is-contained-within-an-expression-like-1-3-5-10-15-20/14460367#14460367) – Ben 2013-02-23 20:48:15

+0

@Ben - 感謝您的提示。請根據您的技巧查看新代碼(使用相關的子查詢)。它似乎並不短。但可能會更快。有沒有更優雅的方式來應用你的想法? – 2013-02-24 00:36:40

相關問題