#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 $