Postgres, как разложить эту проблему, импортируя непохожую схему, требующую «разветвления» массива категорий в таблицу категорий

#sql #postgresql

Вопрос:

Я импортирую из другой схемы; поле, которое я импортирую, содержит разделенный запятыми список категорий в переменной (например, категории: «foo, bar, baz, boo»)

 id name categories 1 abc foo,bar 2 def baz,boo  

Собственная схема содержит таблицу имен категорий (например, имя идентификатора 1:»foo», имя идентификатора 2:»бар», …) и таблицу item_to_category, которая связывает идентификатор элемента с идентификатором категории.

Как бы это было сделано в SQL, в частности, в Postgres, какие шаги предпринимаются — разбейте это. Является ли SQL подходящим инструментом для этого или есть лучшая стратегия?

Ответ №1:

Я решил эту проблему, создав функцию, перебрав все записи и извлек массив строк в массив varchar [], повторив это и выведя данные в мою таблицу категорий и индексов. С кем-то, где-то.

 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 $