Извлечь строку между словом и символом - PullRequest
0 голосов
/ 30 апреля 2020

Для PostgreSQL.

У меня есть строка, в которой есть метаданные для рекламных кампаний.

Пример: date:20200429-category:phones-audience:youth-promo:nooffer

Я хочу иметь возможность извлекать значение для каждого ключа / пары, например, извлекать телефоны для столбца категории, извлекать молодежь для колонка аудитории.

Редактировать:
Прямо сейчас у меня есть то, что я делаю: split_part(split_part(example_string_field, 'category:',2),'-',1) Но это кажется немного грязным.

Ищу помощи, спасибо.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Я в основном согласен с Богемианом, что с вашим решением все в порядке, но вы можете пройти через некоторые манипуляции со строками, чтобы превратить его в таблицу значений, что делает последний шаг просто набором выбора для отдельных столбцов. Несколько упрощает анализ новых столбцов, просто добавьте еще одну строку в crosstabbed_data.

testdb=# with input_rows as (
select 'date:20200429-category:phones-audience:youth-promo:nooffer' as data
UNION ALL
select 'date:20200430-category:tablet-audience:olds-promo:offer'
),
eav_data as (
SELECT rownum, k_v[1] part, k_v[2] val
FROM
  (
  SELECT rownum, string_to_array(item, ':') AS k_v
  FROM (select rownum, unnest(items) as item from (
    select row_number() over () as rownum, string_to_array(data, '-') as items from input_rows)_0
  )_1 )_2
),
rownums as (select rownum as num from eav_data group by rownum),
crosstabbed_data as (
select
  (select val from eav_data where rownum=num and part='date') as date,
  (select val from eav_data where rownum=num and part='category') as category,
  (select val from eav_data where rownum=num and part='audience') as audience,
  (select val from eav_data where rownum=num and part='promo') as promo
from rownums)
select * from crosstabbed_data;
   date   | category | audience |  promo  
----------+----------+----------+---------
 20200429 | phones   | youth    | nooffer
 20200430 | tablet   | olds     | offer
(2 rows)
0 голосов
/ 30 апреля 2020

Я думаю, вы можете использовать регулярные выражения:

regexp_substr(str, 'category:([^-])+', 1, 1, 'e')
...