Вот оно, Наслаждайтесь !!
CREATE OR REPLACE PROCEDURE public.sp_string_split( "string" VARCHAR(MAX), "delimiter" char)
AS $$
DECLARE
delimeter char := ',';
cnt INTEGER := 1;
no_of_parts INTEGER := 0;
sql VARCHAR(MAX) := '';
item character varying := '';
BEGIN
IF LEN("delimiter") != 0 THEN
delimeter = "delimiter" ;
END IF;
--RAISE NOTICE 'using %', delimeter ;
no_of_parts = (SELECT LENGTH(string) - LENGTH(REPLACE(string, delimeter,'')));
--RAISE NOTICE 'parts length sql %', no_of_parts ;
-- drop table
sql := 'DROP TABLE IF EXISTS split_table;';
--RAISE NOTICE 'executing sql %', sql ;
EXECUTE sql;
-- Create table
sql := 'CREATE TEMPORARY TABLE IF NOT EXISTS split_table (part VARCHAR(255));';
--RAISE NOTICE 'executing sql %', sql ;
EXECUTE sql;
<<simple_loop_exit_continue>>
LOOP
item = (select split_part("string",delimeter,cnt));
--RAISE NOTICE 'item %', item ;
sql := 'INSERT INTO split_table SELECT '''||item||''' ;';
EXECUTE sql;
cnt = cnt + 1;
EXIT simple_loop_exit_continue WHEN (cnt >= no_of_parts + 2);
END LOOP;
END ;
$$ LANGUAGE plpgsql;
Пример использования: -
-- Example 1
call public.sp_string_split('john,smith,jones', ',');
select *
from split_table
-- Example 2
call public.sp_string_split('john|smith|jones', '|');
select *
from split_table