Имена столбцов Oracle REGEXP_SUBSTR для PIVOT

Я работаю с PL/SQL Developer v10 над базой данных Oracle 11g.
В нашей системе есть таблица вопросов и ответов, которую мне нужно «сгладить» для каждого клиента в соответствии с ответом на вопрос.

Один набор вопросов имел специальный код (PIFQ) в описании вопроса, что сделало возможным следующий сценарий. Просто UPPER(substr(q.questiondescription,1,6)), а затем перейдите к списку возможных кодов.

 select * from (
                    select
                      tqs.transactiondetailid as transactiondetailid,
                      q.productid as productid,
                      tqs.answer as QAnswer,
                      UPPER(substr(q.questiondescription,1,6)) as QDesc,
                      tqs.transactionversion as transactionversion
                    from TRANSACTIONDETAILQSHIS tqs
                    inner join question q on q.questionid = tqs.questionid and 
                    q.questiondescription like 'PIFQ%'
    ) pivot (
    min(QAnswer) for QDesc in (
    'PIFQ01','PIFQ02','PIFQ03','PIFQ05','PIFQ06','PIFQ07','PIFQ08','PIFQ09','PIFQ10',
    'PIFQ11','PIFQ12','PIFQ13','PIFQ14','PIFQ15','PIFQ16','PIFQ17','PIFQ18','PIFQ19','PIFQ20',
    'PIFQ21','PIFQ22','PIFQ23','PIFQ24','PIFQ25','PIFQ26','PIFQ27','PIFQ28','PIFQ29','PIFQ30',
    'PIFQ31','PIFQ32','PIFQ33','PIFQ34','PIFQ35')
    )

что приводит к одной строке для всех вопросов, на которые даны ответы в TRANSACTIONDETAILQSHIS.

теперь другой набор вопросов имеет три кода (DT, WIF, WT) разной длины.
некоторые примеры:

DT01. Are you married?
DT05. Do you have children?
WIF1.1.1 First Name
WIF1.2 Date Of Birth
WIF7.10 How many other properties do you own?
WIF14.3.7 Post Code
WIF15 Notes to solicitor
WT01. Will Type

Ни один из кодов не имеет пробелов между ними и не имеет пробела сразу после него, как и все остальные коды в таблице вопросов. Я думаю об использовании REGEXP_SUBSTR здесь, чтобы извлечь коды для поворота и использовать ту же логику для захвата QDesc. Мы говорим о сотнях вопросов, поэтому я бы предпочел не перечислять коды.

Я застрял с созданием регулярных выражений (это только часть, которая выбирает правильные коды вопросов из всех, но после того, как я закончу с этим - это будет проще простого). У меня есть банкомат:

select UPPER(REGEXP_SUBSTR(q.questiondescription,'(WIF|DT|WT)\d{1,2}.')) from question q

он выбирает первую группу (WIF|DT|WT) и первые числа после

DT01. Are you married?
DT05. Do you have children?
WT01. Will Type

как мне сделать логику, которая захватила бы те с . и без них в конце (WIF15).

WIF1.1.1 First Name
WIF1.2 Date Of Birth
WIF7.10 How many other properties do you own?
WIF14.3.7 Post Code
WIF15 Notes to solicitor

person Matas Vaitkevicius    schedule 14.10.2014    source источник


Ответы (2)


Это сработает '(WIF|DT|WT)[([:digit:]|.)]*'

демонстрация SQLFiddle

with my_data(str) as
(
select 'WIF1.1.1 First Name' from dual
union all
select 'WIF1.2 Date Of Birth' from dual
union all
select 'WIF7.10 How many other properties do you own?' from dual
union all
select 'WIF14.3.7 Post Code' from dual
union all
select 'WIF15 Notes to solicitor' from dual
)
select str, regexp_substr(str,'(WIF|DT|WT)[([:digit:]|.)]*') as result from my_data;

Результат:

STR                                           RESULT
--------------------------------------------------------
WIF1.1.1 First Name                           WIF1.1.1
WIF1.2 Date Of Birth                          WIF1.2
WIF7.10 How many other properties do you own? WIF7.10
WIF14.3.7 Post Code                           WIF14.3.7
WIF15 Notes to solicitor                      WIF15
person Maheswaran Ravisankar    schedule 14.10.2014
comment
Пропущены вопросы DT и WT, но это, безусловно, работает с . точками. - person Matas Vaitkevicius; 14.10.2014
comment
Вы чемпион! Большое спасибо. - person Matas Vaitkevicius; 14.10.2014

(WIF|DT|WT)\d{1,2}.?

Попробуйте это. Сделайте . необязательным.

person vks    schedule 14.10.2014