“split_part”将列结构化为表格?

时间:2017-06-28 09:05:28

标签: postgresql

我是一名数字营销经理,正在尝试将我的广告系列细分为切片分析。我的广告系列列在一列中,如下所示。

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

我想先将每个分开 - 然后|然后在{。

The result being 
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}。 我需要将所有内容保持在|之间和{在同一栏内。 有没有办法挽救这个公式,还是我应该从头开始搜索某些东西?

这是另一个例子 ES-SRC-IOT |连通性| SIM |美国{e}。

ColA|ColB|ColC|ColD                   |ColE
ES  |SRC |IOT |Connectivity| SIM | USA|{e}

谢谢

2 个答案:

答案 0 :(得分:0)

不确定这里是否有任何优雅的解决方案。我做什么 - 用大括号切成两个以排除最后一列,然后只重用你的代码。对于最后一个分隔符,我使用cc列与'|'连接 - 它当然需要准确的语法。无论如何:

t=# with a(v) as (values('ES-SRC-IOT | Connectivity | SIM | USA {e}'),('FR-SRC-PLATFORM | MISC {bw}'))
, pre as (select split_part(v,'{',1) a,split_part(v,'{',2) b from a)
select split_part(a,'-',1) ca, split_part(a,'-',2) cb, split_part(split_part(a,'-',3),'|',1) cc, split_part(split_part(a,'-',3),split_part(split_part(a,'-',3),'|',1)||'|',2) cd, '{'||b ce from pre;
 ca | cb  |    cc     |             cd             |  ce
----+-----+-----------+----------------------------+------
 ES | SRC | IOT       |  Connectivity | SIM | USA  | {e}
 FR | SRC | PLATFORM  |  MISC                      | {bw}
(2 rows)

所以在你的情况下,查询将是:

with a(v) as (select your_col from your_table)
    , pre as (select split_part(v,'{',1) a,split_part(v,'{',2) b from a)
    select split_part(a,'-',1) ca, split_part(a,'-',2) cb, split_part(split_part(a,'-',3),'|',1) cc, split_part(split_part(a,'-',3),split_part(split_part(a,'-',3),'|',1)||'|',2) cd, '{'||b ce from pre;

答案 1 :(得分:0)

**Courtesy of Vao **

t=# with a(v) as (values('ES-SRC-IOT | Connectivity | SIM | USA {e}'),
('FR-SRC-PLATFORM | MISC {bw}'))
, pre as (select split_part(v,'{',1) a,split_part(v,'{',2) b from a)
select split_part(a,'-',1) ca, split_part(a,'-',2) cb, split_part
(split_part (a,'-',3),'|',1) cc, split_part(split_part(a,'-',3),
split_part   (split_part(a,'-',3),'|',1)||'|',2) cd, '{'||b ce from pre;
 ca | cb  |    cc     |             cd             |  ce
----+-----+-----------+----------------------------+------
 ES | SRC | IOT       |  Connectivity | SIM | USA  | {e}
 FR | SRC | PLATFORM  |  MISC                      | {bw}

(2行)