Я не знаком с Postgre, но, возможно, вы можете попробовать общее табличное выражение для построения таблицы, индексирующей ваши условия поиска и выходные результаты для группы и подгруппы, которые могут выглядеть примерно так (конечно, условия могут быть из реальной таблицы ...):
with Lookup as (
select 0 as start, 3 as end,
'01' as match, 'group one' as sgroup, 'subgroup a' as subgroup union
select 0 as start, 4 as end,
'123' as match, 'group one' as sgroup, 'subgroup a' as subgroup union
select 0 as start, 5 as end,
'4567' as match, 'group two' as sgroup, 'subgroup a' as subgroup union
select 0 as start, 6 as end,
'99999' as match, 'group three' as sgroup, 'subgroup a' as subgroup union
select 0 as start, 3 as end,
'07' as match, 'group three' as sgroup, 'subgroup b' as subgroup union
)
select
L.sgroup as new_field,
L.subgroup as another_new_field
from table T
left join Lookup L on "substring"(T."Field"::text, L.start, L.End) = L.match
Тогда вам нужно только один раз определить условия и сопоставить их один раз, чтобы получить оба поля. Как было сказано @Tom в комментарии, этот тип сценария плохо обрабатывается в SQL, поэтому у вас остается более «хакерское» решение, подобное приведенному выше.
С наилучшими пожеланиями,