删除整个列中的子字符串

时间:2017-06-26 12:33:53

标签: postgresql

我正在尝试清理表格中的所有列,以便为报告我的数字营销广告系列创建明确的归因/参考。目标是保留字符串的一部分,同时删除所有其他字符串。我的营销广告系列中的所有字符串都有用于分隔每个子字符串的符号。

附上我当前桌子和所需桌子的图片。

Current and desired table

我基本上只是试图保留字符串结构的一部分并删除所有其他子字符串。我已经成功地通过将以下公式应用于单独的线程来成功地完成此任务。

update adwords
set campaign = substring(campaign from '%-%-#"%#"' for '#')
where campaign like '%-%-%';

这完全有效,但是,我不完全理解为什么到目前为止在这个论坛上找不到明确的答案。

我如何将其应用于未来的行?广告组和匹配类型可用于此目的。

非常感谢。

1 个答案:

答案 0 :(得分:0)

第一件事:您修改源数据。改为使用ETL,并将其转换为最终阶段。定期执行此操作,从而处理新数据。

可以只创建一个 适用于所有新数据的触发器,但有两个警告:

  1. 失败会导致数据丢失而您无法进行质量检验。
  2. 如果您错误地修改了源数据,除非您有备份,否则无法撤消它,即使这样也太难了。
  3. 所以请看Talend或Pentaho Kettle等ETL工具;创建自己的ETL脚本,或者其他什么。使用Jenkins定期安排所有这些,然后进行设置。

    现在,关于转型本身。

    for '#'
    

    表示#将是转义符号,这意味着在这种情况下#"将被视为常规报价。

    substring(campaign from '%-%-#"%#"' for '#')
    

    因此,选择模式中引号之间的所有内容。 %是一个通配符,与LIKE比较中使用的相同。所以最后一组中的所有内容都将被退回。使用正则表达式

    可以做得更好
    substring(campaign from '.*?-.*?-(.*)')
    

    对于第二列,正则表达式为^(.*?)\s*\{
    而对于第三个 - 类似:^(.*?)\s*\}

    我会像这样创建新表:

    CREATE TABLE aw_final AS
    SELECT
        substring(campaign FROM '^\w{2}-\w+-(.*)$') AS campaign,
        substring(ad_group FROM '^(\w+)\s*\{\w+\}$') AS ad_group,
        substring(match_type FROM '^(\w+)\s*\}$') AS match_type
    FROM adwords
    WHERE campaign ~ '^\w{2}-\w+-(.*)$'
    

    但是如果你必须进行更新,那将是这样的:

    UPDATE adwords SET
        campaign = substring(campaign FROM '^\w{2}-\w+-(.*)$'),
        ad_group = substring(ad_group FROM '^(\w+)\s*\{\w+\}$'),
        match_type = substring(match_type FROM '^(\w+)\s*\}$')
    WHERE campaign ~ '^\w{2}-\w+-(.*)$'