Я работаю с 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