Тъй като не знаете предварително броя/видовете редове, бих ви предложил да направите така:
- (1) импортирайте вашия CSV във (временна?) таблица с една текстова колона без разделяне. Използвайте
backspace
символ като разделител, така че целият импортиран ред да остане непокътнат;
CREATE TABLE IF NOT EXISTS rawtext_t (rawtext text);
COPY rawtext_t FROM <file_name> WITH (format 'csv', delimiter E'\b');
- (2) изпълнете заявка, която разделя CSV файла в текстов масив
- функция
parse_csv
, и след това използвайте получения набор от текстови масиви като подходящи (може би картографиране/вмъкване в „истинската“ целева таблица)
WITH rawdata AS
(
SELECT parse_csv(rawtext) arr FROM rawtext_t
)
INSERT INTO real_t (...fields...)
SELECT arr[1], arr[3], ...
FROM rawdata;
TRUNCATE TABLE rawtext_t;
Можете да добавите WHERE
клауза във втория SELECT
оператор, за да филтрирате входящите редове, ако е необходимо.
Друга опция - много добър според моите разбирания - е да използвате отличния file_textarray_fdw до повече или по-малко същия ефект.
Надяваме се, че това ви дава идеи и ви помага.