postgres-basename-dirname/basename.sql

48 lines
1.2 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION basename(fullpath text,
suffix text DEFAULT NULL,
separator char DEFAULT '/')
RETURNS text AS
$$
DECLARE
basename text;
suffixre text;
separare text;
BEGIN
separare := '^.*' || separator;
basename := regexp_replace(fullpath, separare, '');
IF suffix IS NOT NULL THEN
suffixre := suffix + '$';
basename := regexp_replace(basename, suffixre, '');
END IF;
RETURN basename;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
CREATE OR REPLACE FUNCTION dirname(fullpath text,
separator char DEFAULT '/')
RETURNS text AS
$$
DECLARE
separare text;
dirname text;
compname text;
BEGIN
IF position(separator in fullpath) = 0 THEN
return '';
END IF;
separare := '^(.*' || separator || ').*$';
dirname = regexp_replace(fullpath, separare, '\1');
IF length(dirname) != 0 THEN
compname := lpad('', length(dirname), separator);
IF compname != dirname THEN
dirname = rtrim(dirname, separator);
END IF;
END IF;
return dirname;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;