我有一个名为 CLIENT_REPORT 的表,其中包含 CAMPAIGN_NAME 和 CAMPAIGN_ID,如下所示:
CAMPAIGN_ID | CAMPAIGN_NAME
IO000001 | MOBILE_WEB_PREROLL_ROGERS_IO00001
IO000002 | MOBILE_WEB_NONEGUARANTEE_ROGERS_IO00002
....
我想删除除客户名称和他们的 CAMPAIGN_ID 之外的所有其他内容,所以在这种情况下我想要
CAMPAIGN_NAME
ROGERS_IO00001
ROGERS_IO00002
我创建了一个查找表
CREATE OR REPLACE TABLE REPLACEMENT_TABLE (
string_pattern VARCHAR(16),
string_replacement VARCHAR(16)
)
INSERT INTO REPLACEMENT_TABLE (
string_pattern,
string_replacement
)
VALUES
('MOBILE_', ''),
('WEB_', ''),
('PREROLL_', ''),
('NONEGUARANTEE_', ''),
('XP_', ''),
('MA_', ''),
....
;
表在同一个数据库中,但架构不同,我不知道如何合并两者。 CLIENT_REPORT 在 SALES 架构中,REPLACEMENT_TABLE 表在 UTILITY 架构中
这是我迄今为止尝试过的..
SELECT REPLACE("CAMPAIGN_NAME",
"MY_DB"."UTILITY"."REPLACEMENT_TABLE".string_pattern,
"MY_DB"."UTILITY"."REPLACEMENT_TABLE".string_replacement)
FROM "MY_DB"."SALES"."CLIENT_REPORT";
SQL compilation error: error line 1 at position 43 invalid identifier 'MY_DB.UTILITY.REPLACEMENT_TABLE'
答案 0 :(得分:1)
毫无疑问,您可以通过多种方式来解决这个问题。一种方法是简单地重建您想要的字符串:
select cr.*,
rt.string_pattern || '_' || cr.campaign_id
from client_report cr join
replacement_table rt
on cr.campaign_name like '%' || rt.string_pattern || '%';
答案 1 :(得分:1)
对此进行了测试,只要 REPLACEMENT_TABLE 不会变得太大(object_construct 中为 16 MB),它就可以工作
create or replace function replace_from_list(S string, R array)
returns string
language javascript strict immutable
as
$$
for (var i = 0; i < R.length; i++) {
S = S.replace(R[i].STRING_PATTERN, R[i].STRING_REPLACEMENT);
}
return S;
$$;
select CAMPAIGN_ID, replace_from_list(CAMPAIGN_NAME, (select array_agg(object_construct(*)) from REPLACEMENT_TABLE)) as CAMPAIGN_NAME from CLIENT_REPORT;