2017-06-27 19 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的新手,只需要創建一個簡單的工作流程來自動執行報告。再次感謝。 –