Вы можете выполнить условное агрегирование:
select
oh_idnr,
regexp_substr(ocv_vname, 'response_part_0_script_\d_') ocv_vname_common,
max(case when ocv_vname like '%_code_0' then ocv_value end) code_0,
max(case when ocv_vname like '%_queryType' then ocv_value end) queryType,
max(case when ocv_vname like '%_resourceName' then ocv_value end) resourceName,
max(case when ocv_vname like '%_saveTo' then ocv_value end) saveTo,
max(case when ocv_vname like '%_useArray' then ocv_value end) useArray
from mytable
group by oh_idnr, regexp_substr(ocv_vname, 'response_part_0_script_\d_')
Демонстрация на DB Fiddle :
OH_IDNR | OCV_VNAME_COMMON | CODE_0 | QUERYTYPE | RESOURCENAME | SAVETO | USEARRAY
------: | :------------------------ | :--------------- | :-------- | :------------------- | :------- | :-------
8420518 | response_part_0_script_0_ | $[*].id | JSONPath | profileIds# | variable | TRUE
8420518 | response_part_0_script_1_ | $[*].name | JSONPath | profileNames# | variable | TRUE
8420518 | response_part_0_script_2_ | $[*].environment | JSONPath | profileEnvironments# | variable | TRUE
8420518 | response_part_0_script_3_ | $[*].description | JSONPath | profileDescriptions# | variable | TRUE
Вы можете найти вначале более читабельно разбирать в подзапросе:
select
oh_idnr,
ocv_vname_common,
max(case when ocv_var_name = 'code_0' then ocv_value end) code_0,
max(case when ocv_var_name = 'queryType' then ocv_value end) queryType,
max(case when ocv_var_name = 'resourceName' then ocv_value end) resourceName,
max(case when ocv_var_name = 'saveTo' then ocv_value end) saveTo,
max(case when ocv_var_name = 'useArray' then ocv_value end) useArray
from (
select
oh_idnr,
regexp_substr(ocv_vname, 'response_part_0_script_\d_') ocv_vname_common,
regexp_replace(ocv_vname, 'response_part_0_script_\d_', '') ocv_var_name,
ocv_value
from mytable
) t
group by oh_idnr, ocv_vname_common
Демонстрация на DB Fiddle