Sql 使用字符串函数的Oracle联接表

Sql 使用字符串函数的Oracle联接表,sql,string,oracle,join,Sql,String,Oracle,Join,我必须加入表CAMPAIGN和WF\u ACTIVITY,以便CAMPAIGN.CAMPAIGN\u KEY=WF\u ACTIVITY.PARAMETERS='CAMPAIGN\u KEY='。WF\u ACTIVITY表具有参数列,其中包含值,例如: CAMPAIGN_KEY=ROAMING_DATA_FLAT STEP_KEY=START_COLLECTION PARAM_KEY=BYPASS_PROVISIONING 我只需要从参数列中获取具有'CAMPAIGN\u KEY='字符串的

我必须加入表
CAMPAIGN
WF\u ACTIVITY
,以便
CAMPAIGN.CAMPAIGN\u KEY=WF\u ACTIVITY.PARAMETERS='CAMPAIGN\u KEY='
WF\u ACTIVITY
表具有参数列,其中包含值,例如:

CAMPAIGN_KEY=ROAMING_DATA_FLAT
STEP_KEY=START_COLLECTION
PARAM_KEY=BYPASS_PROVISIONING

我只需要从参数列中获取具有
'CAMPAIGN\u KEY='
字符串的值,并将其与
CAMPAIGN
表中的
CAMPAIGN\u KEY
列值连接。我真的不知道我可以使用哪些字符串函数,或者如何从具有
'CAMPAIGN\u KEY='值的参数列中修剪字符串部分。
你不需要任何特殊的功能来实现你想要的

设置:

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\u KEY之前附加“CAMPAIGN\u 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

你不需要任何特殊的功能来实现你想要的

设置:

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\u KEY之前附加“CAMPAIGN\u 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
如中所述,您不需要使用任何字符串函数,但如果您确实想这样做,您可能需要使用
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=';

如中所述,您不需要使用任何字符串函数,但如果您确实想这样做,您可能需要使用
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=';

您是否希望加入,例如,
活动。活动密钥
等于
foo
WF\u活动。参数
等于
活动密钥=foo
?您是否希望加入,例如,
CAMPAIGN.CAMPAIGN_KEY
等于
foo
WF_ACTIVITY.PARAMETERS
等于
CAMPAIGN_KEY=foo
?我还需要使用where条件吗?因为我有数千条记录,并且Paramaters列没有索引,所以在这种情况下查询性能会很慢。如果使用这种方法,我认为您希望子字符串包含前13个字符='CAMPAIGN_KEY=',否则如果有其他具有类似名称的参数,您将遇到问题(例如“活动密钥”或“活动密钥长度”)@Rahul不,你不需要。感谢它现在运行的finw:)我还需要使用where条件吗?因为我有数千条记录,并且Paramaters列没有索引,所以在这种情况下查询性能会很慢。如果使用这种方法,我认为您希望子字符串包含前13个字符='CAMPAIGN_KEY=',否则如果有其他具有类似名称的参数,您将遇到问题(例如“活动密钥”或“活动密钥长度”)@Rahul不,你不需要。感谢它现在运行的finw:)我还需要使用where条件吗?因为我有数千条记录,而Paramaters列没有索引,所以在这种情况下,查询性能会很慢。@Rahul,不,从技术上讲,你不会。获取一个双向解释计划,并使用性能最好的计划。感谢标记它现在运行良好:)我还需要使用where条件吗?因为我有数千条记录,而Paramaters列没有索引,所以在这种情况下,查询性能会很慢。@Rahul,不,从技术上讲,你不会。获取双向解释计划,并使用性能最佳的计划。谢谢,现在标记其运行良好:)