0

I am trying to write some postgresql functions to help me parse a string value like "30Gi" or "25Ti". I tried this, but can't get the syntax right, and can't figure out what the return type should be for the first function.

CREATE FUNCTION get_matches(VARCHAR) RETURNS ARRAY(VARCHAR) AS 
SELECT (regexp_matches ($1, '(\d+)([KGTM]i)'));

CREATE FUNCTION get_amount(ARRAY(VARCHAR)) RETURNS VARCHAR AS 
SELECT get_matches($1)[1];

CREATE FUNCTION get_units(ARRAY(VARCHAR)) RETURNS VARCHAR AS 
SELECT get_matches($1)[2];

Postgres version: PostgreSQL 13.2 on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit Testing my functions using pgAdmin4.

1 Answer 1

1

You can get both returned in a single query. The following returns a table of 2 columns size and units for valid expressions. After validating the parameter is correctly formatted (via regex) it uses basically the same with regexp_replace to return each component.

create or replace function size_units(p_size_units text)
     returns table ( size  integer
                   , units text
                   )
    language sql
as $$; 
   select regexp_replace(p_size_units, '^(\d+)([KGTM]i)$', '\1')::integer
        , regexp_replace(p_size_units, '^(\d+)([KGTM]i)$', '\2')
    where p_size_units ~ '^\d+[KGTM]i$';
$$;

You can use the results in a select statement if desired. (see demo).

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.