雪花 SQL 替换多个单词

时间:2021-02-12 18:36:56

标签: sql string replace snowflake-cloud-data-platform

我有一个名为 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'

2 个答案:

答案 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;