2014-10-14 3 views
1

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

В одном из вопросов, которые задали следующий сценарий, был задан конкретный код (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 здесь, чтобы извлечь коды для pivot и использовать ту же логику для захвата QDesc. Мы говорим о 100 вопросах, поэтому я бы предпочел не перечислять коды.

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

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 

ответ

3

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

SQLFiddle Demo

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 
+0

пропущенный DT и WT вопросы, но это, безусловно, делает работу с '.' точек. –

+0

Это была опечатка .. Я использовал WI вместо WT .. Исправил ее теперь, она тоже должна работать. –

+0

Вы чемпион! Большое спасибо. –

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

Попробуйте this.Make . необязательными.

Смежные вопросы