Skip to content Skip to sidebar Skip to footer

"split_part" To Structure A Column Into A Table?

I am a digital marketing manager and am trying to breakdown my campaigns for sliced analysis. My campaigns are listed in one column as follows. FR-SRC-PLATFORM | MISC {bw} FR-S

Solution 1:

If you familiar with plpgsql:

dropfunction if exists foo(text, out text, out text, out text, out text, out text);
createfunction 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;

Result:

╔═══════════════════════════════════════════╤══════╤══════╤══════════╤══════════════════════════╤══════╗
║                     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}  ║
╚═══════════════════════════════════════════╧══════╧══════╧══════════╧══════════════════════════╧══════╝

And it will be very simple to adapt the function's logic if you will found yet another case of your data.

Solution 2:

I'd go with regex substring

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;

gives

            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

Post a Comment for ""split_part" To Structure A Column Into A Table?"