Может ли функция TRIM в SQL быть более точной? - PullRequest
2 голосов
/ 09 марта 2020

У меня есть таблица импорта, которую я хочу разделить на другие таблицы. В таблице импорта есть столбец, в котором данные его полей имеют следующий формат: ['email', 'phone', 'facebook'].

Чтобы разделить каждое значение в поле (в данном случае электронная почта, телефон и Facebook), который я использую функция TRIM, когда я вставляю ее в соответствующую таблицу, например:

insert into Media (media)
select distinct trim ('{}' from regexp_split_to_table(host_media, ','))
from ImportH;

Но данные, вставленные в новую таблицу, выглядят грязными, например, в строке 1 у меня будет ['email', в строке 2: 'phone' и в строке 3: 'facebook'].

Как сделать так, чтобы данные вставлялись в таблицу чистым способом, без '[' и плавающих запятых?

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

enter image description here

enter image description here

Ответы [ 3 ]

2 голосов
/ 09 марта 2020

Вы можете просто изменить сплиттер:

select *
from regexp_split_to_table('[''email'', ''phone'', ''facebook'']', '[^_a-zA-Z]+') s(value)
where value <> '';

Сплиттеры - это просто те символы, которые НЕ являются действительными символами для нужных вам строк.

Здесь - это дб <> скрипку.

0 голосов
/ 10 марта 2020

Вот другой подход, который использует функции json.

Сначала создайте таблицу мультимедиа;

CREATE TABLE media AS (
  WITH my_medias AS (
    SELECT
        jsonb_array_elements_text(jsonb_agg(DISTINCT medias ORDER BY medias)) media
      FROM impor_th, jsonb_array_elements_text(replace(host_media, '''', '"')::jsonb) medias
  )
  SELECT
      row_number() OVER () media_id,
      *
    FROM my_medias
);

Затем создайте таблицу отношений многие-ко-многим;

CREATE TABLE media_host AS (
  WITH elements AS (
    SELECT
        id,
        jsonb_array_elements_text(replace(host_media, '''', '"')::jsonb) media
      FROM impor_th i
  )
  SELECT
      e.id AS impor_th_id,
      m.media_id
    FROM elements e
    JOIN media m ON m.media = e.media
);
0 голосов
/ 09 марта 2020

Один из вариантов ... Может быть, это будет хорошо для вас:

with trimed as
(select substring(host_media from 2 for length(host_media)-2) as clean_col
from ImportH
)
insert into Media (media)
select unnest(string_to_array(clean_col, ',')) 
from trimed;

Вот демоверсия

Я понял "плавающие запятые" "термин немного опоздал, поэтому я добавил некоторые изменения в свой запрос:

with trimed as
(select replace(substring(host_media from 2 for length(host_media)-2), '''', '') as clean_col
 from ImportH
)
insert into Media (media)
select ltrim(unnest(string_to_array(clean_col, ','))) 
from trimed;
...