Как извлечь имена столбцов и их значения из таблицы базы данных, которые объединяются - PullRequest
0 голосов
/ 08 ноября 2019

Разделите значения столбцов, которые объединяются в таблице базы данных (имя_ столбца1, значения1, имя столбца2, значения2, ....), анализируя строку.

У меня есть таблица, например, "tab1" и имя столбца "rule_sql".

Столбец "rule_sql" имеет следующие значения -

COUNTRY_CODE IN ('766') COMPANY_CODE IN ('03') COLLECTION_UNIT_CODE IN ('000099')   
COUNTRY_CODE IN ('624') COMPANY_CODE IN ('02') COLLECTION_UNIT_CODE IN ('BE0001','000COM','000INT','00FSCY')

В столбце даже есть такие значения, как -

COLLECTION_UNIT_CODE IN ('006800','000205','999999','110009','007279') COUNTRY_CODE IN ('869') COMPANY_CODE IN ('01') 

Имена столбцов, которые нужно извлечь / проанализировать, не находятся в одномзаказ.

Ожидаемый результат -

COUNTRY_CODE || COMPANY_CODE || COLLECTION_UNTI_CODE

766           || 03          || 000099
624           || 02          || BE0001,000COM, 000INT, 00FSCY
869           || 01          || 006800,000205,999999,110009,007279

1 Ответ

1 голос
/ 08 ноября 2019

Вы можете использовать regex_replace():

select 
    regexp_replace(rule_sql, '^.*COUNTRY_CODE IN \(([^)]+)\).*$', '\1') country_code,
    regexp_replace(rule_sql, '^.*COMPANY_CODE IN \(([^)]+)\).*$', '\1') company_code,
    regexp_replace(rule_sql, '^.*COLLECTION_UNIT_CODE IN \(([^)]+)\).*$', '\1') collection_unit_code
from mytable

Демонстрация на DB Fiddle :

with mytable as (
    select 'COUNTRY_CODE IN (''766'') COMPANY_CODE IN (''03'') COLLECTION_UNIT_CODE IN (''000099'')' rule_sql from dual
    union all select 'COUNTRY_CODE IN (''624'') COMPANY_CODE IN (''02'') COLLECTION_UNIT_CODE IN (''BE0001'',''000COM'',''000INT'',''00FSCY'')' from dual
)
select 
    regexp_replace(rule_sql, '^.*COUNTRY_CODE IN \(([^)]+)\).*$', '\1') country_code,
    regexp_replace(rule_sql, '^.*COMPANY_CODE IN \(([^)]+)\).*$', '\1') company_code,
    regexp_replace(rule_sql, '^.*COLLECTION_UNIT_CODE IN \(([^)]+)\).*$', '\1') collection_unit_code
from mytable
COUNTRY_CODE | COMPANY_CODE | COLLECTION_UNIT_CODE               
:----------- | :----------- | :----------------------------------
'766'        | '03'         | '000099'                           
'624'        | '02'         | 'BE0001','000COM','000INT','00FSCY'

Примечание: чтобы удалить оставшиеся кавычки, затем оберните результаты с помощью replace():

select 
    replace(regexp_replace(rule_sql, '^.*COUNTRY_CODE IN \(([^)]+)\).*$', '\1'), '''', '') country_code,
    replace(regexp_replace(rule_sql, '^.*COMPANY_CODE IN \(([^)]+)\).*$', '\1'), '''', '') company_code,
    replace(regexp_replace(rule_sql, '^.*COLLECTION_UNIT_CODE IN \(([^)]+)\).*$', '\1'), '''', '') collection_unit_code
from mytable

Демо :

COUNTRY_CODE | COMPANY_CODE | COLLECTION_UNIT_CODE       
:----------- | :----------- | :--------------------------
766          | 03           | 000099                     
624          | 02           | BE0001,000COM,000INT,00FSCY
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...