sql - Postgres如何分解这个导入不同模式的问题,需要将一个类别数组“扇出”到一个类别表中
问题描述
我从不同的模式导入;我正在导入的字段在 varchar 中有一个以逗号分隔的类别列表(例如,类别:“foo、bar、baz、boo”)
id name categories
1 abc foo,bar
2 def baz,boo
本机模式有一个类别名称表(例如 id 1 名称:“foo”,id 2 名称:“bar”,...)和一个表 item_to_category,它将项目的 id 链接到类别的 id。
一个人如何在 SQL 中解决这个问题,特别是 Postgres,采取了哪些步骤 - 将其分解。SQL 是正确的工具还是有更好的策略?
解决方案
我通过创建一个函数、迭代所有记录并将字符串数组提取到一个 varchar[] 数组、迭代它并输出到我的类别和索引表中来解决它。HTH 某人,某处。
CREATE TABLE public.categories (
id SERIAL PRIMARY KEY NOT NULL,
parent Integer,
category Text NOT NULL UNIQUE
);
CREATE TABLE public.companies_categories (
id SERIAL PRIMARY KEY NOT NULL,
category_id Integer NOT NULL,
company_id Integer NOT NULL
);
create or replace function scan_categories()
returns setof categories as $$
declare
category_list varchar[];
category_text varchar;
category_id int;
company_id int;
BEGIN
FOR category_list, company_id IN SELECT categories, id FROM public.companies
LOOP
IF category_list IS NOT NULL
THEN
FOREACH category_text IN ARRAY category_list
LOOP
INSERT INTO public.categories(category) VALUES (category_text) ON CONFLICT DO NOTHING;
SELECT id FROM public.categories INTO category_id WHERE category LIKE category_text;
INSERT INTO companies_categories (category_id, company_id) VALUES (category_id, company_id);
END LOOP;
END IF;
END LOOP;
END
$$
推荐阅读
- html - 当导航栏类的位置更改为相对位置时,为什么之前的伪选择器会产生不同的结果?
- javascript - 如何限制特定年龄的人登录我们的 WordPress 网站
- python - 无法在 Spyder 中安装模块
- scala - 如何使用 Spark/Scala 在 HDFS 上编写/创建 zip 文件?
- git - 我可以在 DataGrip 中使用现有的本地存储库吗?
- oracle - 带有预处理的 Apache NiFi JSON 到 SQL
- csv - 如何使用 JMeter 计算 CSV 文件中整数或双精度值的总和
- ffmpeg - FFmpeg 从没有音频的视频创建静音音频文件
- javascript - 当侦听器在文档上时获取所需的事件目标
- google-analytics - 谷歌分析奇怪的用户数