2017-06-27 17 views
0

我是一名数字营销经理,并试图将我的广告系列细分为分片分析。我的广告系列按以下方式列在一列中。“split_part”将一个列构造成一个表?

FR-SRC-PLATFORM | MISC {bw} 
    FR-SRC-M2M sim | Sim {bw} 
    ES-SRC-IOT | Connectivity {e} 

我想分开每一个基于 - 然后|然后在{。

结果是

Cola | Colb | Colc | Col d | Col e 
fr | SRC | Platform| Misc | {bw} 

我发现下面的公式,工作,但只有一个问题... ...

SELECT split_part(your_col,'-',1) cola, 
split_part(your_col,'-',2) colb, 
split_part(split_part(your_col,'-',2),' | ',1) colc, 
split_part(split_part(your_col,' | ',2),' {',1) cold, 
split_part(split_part(your_col,'{',2),'}',1) cole 
/* or 
    split_part(your_col,'{',2) cole 
*/ 
FROM your_table 

它有时会发生,我的活动都会有不同的结构(更多关键字),导致更多的条件被|分隔符号。作为例子; ES-SRC-IOT |连接性| SIM |美国{e}。理论上我会保留第一个|之间的所有内容和第一个{在同一列内。

有没有挽回这个公式的方法,或者我应该从头开始寻找什么东西?

谢谢您的高级。

谢谢

+0

您是否能够重新设计的表,所以你不会在串联列中的值,而是存储在列中的数据的各个部分和行?因为这是真正的解决方案。 –

+0

我无法做到这一点,因为它从来没有连接在一起。我以前用SQL看过这个,所以我知道这是可能的。 –

回答

0

如果你熟悉plpgsql

drop function if exists foo(text, out text, out text, out text, out text, out text); 
create function foo(p_input text, out cola text, out colb text, out colc text, out cold text, out cole text) 
    returns record immutable language plpgsql as $$ 
declare 
    p1 text; pi1 int; 
    p2 text; pi2 int; 
    p3 text; 
begin 
    -- String is like part1 | part2 {part3} 
    -- So lets split it to this parts: 
    pi1 := position('|' in p_input); 
    pi2 := position('{' in p_input); 

    p1 := trim(substring(p_input, 1, pi1 - 1)); 
    p2 := trim(substring(p_input, pi1 + 1, pi2 - pi1 - 1)); 
    p3 := trim(substring(p_input, pi2)); 

    -- Debug output 
    raise info 'p1: %', p1; 
    raise info 'p2: %', p2; 
    raise info 'p3: %', p3; 

    -- Part1 is like field1-field2-field3: 
    cola := split_part(p1, '-', 1); 
    colb := split_part(p1, '-', 2); 
    colc := split_part(p1, '-', 3); 
    -- And the rest: 
    cold := p2; 
    cole := p3; 

    return; 
end $$; 

with t(x) as (values 
    ('FR-SRC-PLATFORM | MISC {bw}'), 
    ('FR-SRC-M2M sim | Sim {bw}'), 
    ('ES-SRC-IOT | Connectivity {e}'), 
    ('ES-SRC-IOT | Connectivity | SIM | USA {e}') 
) 
select *, (foo(x)).* from t; 

结果:

 
╔═══════════════════════════════════════════╤══════╤══════╤══════════╤══════════════════════════╤══════╗ 
║      x      │ cola │ colb │ colc │   cold   │ cole ║ 
╠═══════════════════════════════════════════╪══════╪══════╪══════════╪══════════════════════════╪══════╣ 
║ FR-SRC-PLATFORM | MISC {bw}    │ FR │ SRC │ PLATFORM │ MISC      │ {bw} ║ 
║ FR-SRC-M2M sim | Sim {bw}    │ FR │ SRC │ M2M sim │ Sim      │ {bw} ║ 
║ ES-SRC-IOT | Connectivity {e}    │ ES │ SRC │ IOT  │ Connectivity    │ {e} ║ 
║ ES-SRC-IOT | Connectivity | SIM | USA {e} │ ES │ SRC │ IOT  │ Connectivity | SIM | USA │ {e} ║ 
╚═══════════════════════════════════════════╧══════╧══════╧══════════╧══════════════════════════╧══════╝ 

这将是适应功能的逻辑很简单,如果你会发现另一起案件的数据。

0

我用正则表达式子去

with e AS (VALUES ('FR-SRC-PLATFORM | MISC {bw}') 
     ,('FR-SRC-M2M sim | Sim {bw}') 
     ,('ES-SRC-IOT | Connectivity {e}') 
     ,('AXE|SPADE|SHOVEL{test}') 
) 
SELECT column1,substring(column1 from $$^([^|]*)\|$$) as a 
    ,substring(column1 from $$^[^|]*\|([^{]*)$$) as b 
    ,substring(column1 from $x$[{](.*)[}]$$x$) as c 
FROM e; 

  column1   |  a   |  b  | c 
------------------------------+------------------+----------------+------ 
FR-SRC-PLATFORM | MISC {bw} | FR-SRC-PLATFORM | MISC   | bw 
FR-SRC-M2M sim | Sim {bw} | FR-SRC-M2M sim | Sim   | bw 
ES-SRC-IOT | Connectivity {e} | ES-SRC-IOT  | Connectivity | e 
AXE|SPADE|SHOVEL{test}  | AXE    | SPADE|SHOVEL | test 
+0

感谢您的回复。您能否将公式修改为最好的结构,或者提供一些关于这个公式如何工作的解释。我是PostgreSQL的新手,只需要创建一个简单的工作流程来自动执行报告。再次感谢。 –