Using generate_subscripts it is easily possible to reverse a domain like www.example.org to org.example.www using postgres plpgsql.
CREATE OR REPLACE FUNCTION rdomain(name VARCHAR) RETURNS VARCHAR AS $$
DECLARE
parts VARCHAR[];
BEGIN
parts = string_to_array(name, '.');
RETURN array_to_string(
ARRAY(
SELECT
parts[i]
FROM
generate_subscripts(parts,1,true) AS s(i)
),
'.'
);
END
$$ LANGUAGE plpgsql;
Use like:
SELECT rdomain('www.example.org');
# org.example.www
In order to reverse a domain and remove some segments, e.g. www.example.org → org.example, generate_series can be used:
CREATE OR REPLACE FUNCTION rdomain(name VARCHAR, num int) RETURNS VARCHAR AS $$
DECLARE
parts VARCHAR[];
BEGIN
parts = string_to_array(name, '.');
RETURN array_to_string(
ARRAY(
SELECT
parts[i]
FROM
generate_series(
array_upper(parts,1),
array_upper(parts,1)-num+1,
-1
) AS s(i)
),
'.'
);
END
$$ LANGUAGE plpgsql;
Use like:
SELECT rdomain('www.example.org', 2);
# org.example
Combining both, segments can be removed from a domain, e.g. www.example.org → example.org.
CREATE OR REPLACE FUNCTION basedomain(name VARCHAR, num int) RETURNS VARCHAR AS $$
BEGIN
RETURN rdomain(rdomain(name, num))
END
$$ LANGUAGE plpgsql;
Use like:
SELECT basedomain('www.example.org', 2);
# example.org