Last active
March 31, 2020 06:18
-
-
Save umanda/3926ee29ab71929a9439c5110dc8547c to your computer and use it in GitHub Desktop.
Get all children of parent recursively in PostgreSQL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- Table | |
-- DROP SEQUENCE public.data_id_seq; | |
CREATE SEQUENCE "data_id_seq" | |
INCREMENT 1 | |
MINVALUE 1 | |
MAXVALUE 9223372036854775807 | |
START 1 | |
CACHE 1; | |
ALTER TABLE public.data_id_seq | |
OWNER TO postgres; | |
CREATE TABLE public.data | |
( | |
id integer NOT NULL DEFAULT nextval('data_id_seq'::regclass), | |
name character varying(50) NOT NULL, | |
label character varying(50) NOT NULL, | |
parent_id integer NOT NULL, | |
CONSTRAINT data_pkey PRIMARY KEY (id), | |
CONSTRAINT data_name_parent_id_unique UNIQUE (name, parent_id) | |
) | |
WITH ( | |
OIDS=FALSE | |
); | |
INSERT INTO public.data(id, name, label, parent_id) VALUES (1,'animal','Animal',0); | |
INSERT INTO public.data(id, name, label, parent_id) VALUES (5,'birds','Birds',1); | |
INSERT INTO public.data(id, name, label, parent_id) VALUES (6,'fish','Fish',1); | |
INSERT INTO public.data(id, name, label, parent_id) VALUES (7,'parrot','Parrot',5); | |
INSERT INTO public.data(id, name, label, parent_id) VALUES (8,'barb','Barb',6); | |
--- Function | |
CREATE OR REPLACE FUNCTION public.get_all_children_of_parent(use_parent integer) RETURNS integer[] AS | |
$BODY$ | |
DECLARE | |
process_parents INT4[] := ARRAY[ use_parent ]; | |
children INT4[] := '{}'; | |
new_children INT4[]; | |
BEGIN | |
WHILE ( array_upper( process_parents, 1 ) IS NOT NULL ) LOOP | |
new_children := ARRAY( SELECT id FROM data WHERE parent_id = ANY( process_parents ) AND id <> ALL( children ) ); | |
children := children || new_children; | |
process_parents := new_children; | |
END LOOP; | |
RETURN children; | |
END; | |
$BODY$ | |
LANGUAGE plpgsql VOLATILE COST 100; | |
ALTER FUNCTION public.get_all_children_of_parent(integer) OWNER TO postgres | |
--- Test | |
SELECT * FROM data WHERE id = any(get_all_children_of_parent(1)) | |
SELECT * FROM data WHERE id = any(get_all_children_of_parent(5)) | |
SELECT * FROM data WHERE id = any(get_all_children_of_parent(6)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment