2015-04-28 100 views
0

我不得不加入表CAMPAIGN和其中包含的值例如作为WF_ACTIVITY使得CAMPAIGN.CAMPAIGN_KEY = WF_ACTIVITY.PARAMETERS='CAMPAIGN_KEY=' .The WF_ACTIVITY表具有参数列连接表'CAMPAIGN_KEY='字符串从参数列并加入CAMPAIGN_KEY列值CAMPAIGN表。我真的不知道我可以使用哪些字符串函数,或者我如何修剪参数列中的值为'CAMPAIGN_KEY='并昏迷它的字符串部分。甲骨文使用字符串函数

+0

你想加入的,例如,'CAMPAIGN.CAMPAIGN_KEY'等于'foo'和'WF_ACTIVITY.PARAMETERS'等于'CAMPAIGN_KEY = foo'? –

回答

2

你不需要任何特殊的功能来实现你正在寻找的东西。

设置:

create table CAMPAIGN (
    campaign_id number, 
    campaign_key varchar(100) 
); 

create table WF_ACTIVITY (
    wf_activity_id number, 
    parameters varchar(100) 
); 

insert into CAMPAIGN values (1, 'ROAMING_DATA_FLAT'); 
insert into CAMPAIGN values (2, 'ROAMING_DATA_ROUND'); 

insert into WF_ACTIVITY values (1, 'CAMPAIGN_KEY=ROAMING_DATA_FLAT'); 
insert into WF_ACTIVITY values (2, 'STEP_KEY=START_COLLECTION'); 
insert into WF_ACTIVITY values (3, 'PARAM_KEY=BYPASS_PROVISIONING'); 
insert into WF_ACTIVITY values (4, 'CAMPAIGN_KEY=ROAMING_DATA_ROUND'); 

查询:

select * 
from CAMPAIGN c 
join WF_ACTIVITY w on 'CAMPAIGN_KEY=' || c.campaign_key = w.parameters 
where w.parameters like 'CAMPAIGN_KEY=%'; 

所有这一切都不会使用字符串连接c.campaign_key之前 “CAMPAIGN_KEY =” 追加。

结果:

CAMPAIGN_ID CAMPAIGN_KEY  WF_ACTIVITY_ID PARAMETERS 
----------- ------------  -------------- ----------- 
1   ROAMING_DATA_FLAT 1    CAMPAIGN_KEY=ROAMING_DATA_FLAT 
2   ROAMING_DATA_ROUND 4    CAMPAIGN_KEY=ROAMING_DATA_ROUND 
+0

我是否需要使用条件?因为我有成千上万的记录,并且Paramaters列没有编入索引,所以在这种情况下查询性能会很慢。 – Andrew

+0

@Rahul,不,技术上你不知道。获取解释计划的两种方式,并使用最佳表现。 –

+0

感谢马克现在运行良好:) – Andrew

2

正如another answer注意你不需要使用任何字符串函数,但是如果你想要去的,你可能会想用这种方式substr

SELECT * 
FROM CAMPAIGN C 
JOIN WF_ACTIVITY WA ON SUBSTR(WA.PARAMETERS,14) = C.CAMPAIGN_KEY 
-- the where clause is optional 
WHERE SUBSTR(WA.PARAMETERS,0,13) = 'CAMPAIGN_KEY='; 

Sample SQL Fiddle

+0

我需要在哪里使用条件吗?因为我有成千上万的记录,并且Paramaters列没有编入索引,所以在这种情况下查询性能会很慢。 – Andrew

+0

如果使用这种方法,我想你会希望子字符串包含前13个字符='CAMPAIGN_KEY =',否则如果有其他类似名称的参数(如'CAMPAIGN_KEYS'或'CAMPAIGN_KEY_LENGTH' )。 –

+0

@MarkLeiber好点,更新了我的答案。 – jpw