TRIM 在 SQL 中的功能可以更精确吗?

Can TRIM function in SQL be more precise?

我有一个导入 table,我想拆分成其他 table。导入 table 中有一列,其字段的数据具有以下格式:['email', 'phone', 'facebook'].

为了分隔字段中的每个值(在本例中为电子邮件、phone 和 facebook),我在插入对应的 table 时使用函数 TRIM ,像这样:

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

但是插入到新 table 中的数据看起来很脏,例如在第 1 行我会 ['email',在第 2 行:'phone' 和在第 3 行:'facebook'].

我怎样才能让数据以干净的方式插入 table,没有“[”和浮动逗号?

我将提供此列的导入 table 数据的图像以及拆分时得到的结果:

您可以只更改拆分器:

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

分隔符就是您想要的字符串的任何无效字符。

Here 是一个 db<>fiddle.

其中一个选项...也许适合您:

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;

Here is a demo

我理解 "floating commas" 术语有点晚了,所以我对查询进行了一些更改:

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;

这是使用 json 函数的另一种方法。

首先创建媒体table;

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
);

然后创建多对多关系table;

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
);