首页 > 解决方案 > 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 是正确的工具还是有更好的策略?

标签: sqlpostgresql

解决方案


我通过创建一个函数、迭代所有记录并将字符串数组提取到一个 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
$$

推荐阅读