我有"元素"和#34;作者"表,其中元素表可以有一个或多个作者,但表没有规范化(一些人很久以前设计过)。例如:
element_id ... ... authors
369561 319,30,2496,544
数据库足够大,所以我需要一些 SQL脚本来创建和填充连接表,例如: " element_authors"
element_id | author_id
369561 319
369561 30
369561 2496
369561 544
我不知道如何编写此脚本,有什么帮助?
答案 0 :(得分:2)
一般的想法是使用regexp_split_to_table
将逗号分隔字段拆分为一个集合,将每个值转换为integer
,并将结果与我们得到的元组中的element_id
配对原始的逗号分隔字段来自。
对于PostgreSQL 9.3,你要写:
INSERT INTO element_authors(element_id, author_id)
SELECT
element_id,
CAST (author_id AS integer) AS author_id
FROM
element,
LATERAL regexp_split_to_table(nullif(authors, ''), ',') author_id;
或在较旧的PostgreSQL版本上我认为在这种情况下可以安全地编写:
INSERT INTO element_authors(element_id, author_id)
SELECT
element_id,
CAST( regexp_split_to_table(nullif(authors, ''), ',') AS integer) AS author_id
FROM
element;