我对SQL很熟悉,但还没有足够使用它,所以我对PostgreSQL完全陌生。
我的问题是我有两个表,其中一个表的一列包含一个字符串值,该字符串值包含引用其他表的索引,这些表以字符串形式连接,并且我想生成第三个表,该表具有许多索引对多关系。
表1:
tags: {
id: bigint,
tag: character varying(10),
connected: character varying(10),
meaning: character varying(120),
CONSTRAINT: tags_pk PRIMARY KEY (id)
}
表2:
words: {
id: bigint,
form: character varying(255),
lemmas: character varying(255),
original: character varying(255),
tsv_form_text: tsvector,
CONSTRAINT words_pkey PRIMARY KEY (id)
}
这些实际上不是SQL,但应该可以让您理解表。
words.lemmas
包含以下内容:noun:p:m
,其中:
分割的每个部件都是唯一的tags.tag
名称。
我想拆分此lemmas
列,然后为每个标签名称找到标签id
,并用word.id
和{{1}将行写到多对多表中}。
有人可以给我一些有关如何实现这一目标的建议吗?
我曾尝试在pgAdmin的SQL控制台中编写FOR LOOP,但它在FOR附近显示“语法不正确”。我不知道如何使用SELECT
更新
我试图执行的虚拟代码,但仍然无法运行:
tags.id
答案 0 :(得分:2)
unnest(string_to_array(..))
方便快捷。演示
with words(id, lemmas) as (
values
(1, 'as:df:gh')
,(2, 'zx:cv:bn')
), tags(id, tag) as (
values
(11, 'as')
,(12, 'df')
,(13, 'gh')
,(14, 'zx')
,(15, 'cv')
,(16, 'bn')
)
select w.id wordId, t.id tagId
from (
select id, unnest(string_to_array(lemmas, E':')) word
from words
) w
join tags t on t.tag = w.word;