create or replace function range_expansion(s) as ( regexp_extract_all(s, '[^,]+') .list_transform( x -> regexp_extract(x, '(-?[0-9]+)-(-?[0-9]+)|(.*)', ['a', 'b', 'c']) ) .list_transform( x -> if (x.a = '', [x.c::BIGINT], range( x.a::INT, x.b::INT + 1) ) ) .flatten() ); select range_expansion( '-6,-3--1,3-5,7-11,14,15,17-20') as range;