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;
我理解 "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
);
我有一个导入 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;
我理解 "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
);