【问题标题】:Split row string into columns将行字符串拆分为列
【发布时间】:2021-09-22 15:14:26
【问题描述】:

我在一些包含下一个字符串的表中有conversion 列:

9076635012/DOVE/603524/source:unilever/campaign:L-Unilever_Tresemme_SMM_jan-feb2021/content:video_18_Stories/medium:display
707663501/AXE/60364/source:unilever/campaign:AXE/term:instagram/medium:display

我想得到下一个结果:

id brand code source campaign content term medium
9076635012 DOVE 603524 unilever L-Unilever_Tresemme_SMM_jan-feb2021 video_18_Stories NULL display
707663501 AXE 60364 unilever AXE NULL instagram display

我可以轻松拆分id, brand, code

SELECT
split_part(a."conversion", '/', 1)  as id,
split_part(a."conversion", '/', 2) as brand,
split_part(a."conversion", '/', 3) as code

如何拆分下一部分?模式是/attribute_name:/content: 一样,并认为其中一个部分可能不存在于第一行,但可以存在于第二行。如果可能的话 它不必是面向订单的。 campaign 可以在开头(紧跟在code 之后)或结尾。 id, brand, code 始终存在且始终具有相同的顺序。

我试过这样:

substring(split_part(a."conversion", '/source:', 2),'[^\/]') as source

但是获取u 作为来源。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    使用substring 的正则表达式版本和锚字,以便与位置无关。这是带有 CTE 的插图。

    with t(conversation) as
    (
     values 
     ('9076635012/DOVE/603524/source:unilever/campaign:L-Unilever_Tresemme_SMM_jan-feb2021/content:video_18_Stories/medium:display'), 
     ('707663501/AXE/60364/source:unilever/campaign:AXE/term:instagram/medium:display')
    )
    select 
        split_part(conversation, '/', 1)  as id,
        split_part(conversation, '/', 2)  as brand,
        split_part(conversation, '/', 3)  as code,
        substring(conversation from '/source:([^/]+)/?')   as source,   
        substring(conversation from '/campaign:([^/]+)/?') as campaign,   
        substring(conversation from '/content:([^/]+)/?')  as "content",   
        substring(conversation from '/term:([^/]+)/?')     as term,   
        substring(conversation from '/medium:([^/]+)/?')   as medium   
    from t;
    
    /* Result:
    id        |brand|code  |source  |campaign                           |content         |term     |medium |
    ----------+-----+------+--------+-----------------------------------+----------------+---------+-------+
    9076635012|DOVE |603524|unilever|L-Unilever_Tresemme_SMM_jan-feb2021|video_18_Stories|         |display|
    707663501 |AXE  |60364 |unilever|AXE                                |                |instagram|display|
    */
    

    【讨论】:

      【解决方案2】:

      再次分裂:

      SELECT split_part(a."conversion", '/', 1)  as id,
             split_part(a."conversion", '/', 2) as brand,
             split_part(a."conversion", '/', 3) as code,
             split_part(split_part(a."conversion", '/', 4), ':', 1) as source,
             . . .
      

      【讨论】:

      • 订购怎么样? F.e. source 可以在一个字符串中的4 位置,在第二个字符串中的6 位置。我可以处理这个案子吗?
      • @hsadik 。 . .我在你的问题中没有看到这一点。
      猜你喜欢
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      相关资源
      最近更新 更多