Sql PIVOT的Oracle REGEXP_SUBSTR列名

Sql PIVOT的Oracle REGEXP_SUBSTR列名,sql,regex,oracle,pivot,regexp-substr,Sql,Regex,Oracle,Pivot,Regexp Substr,我正在与PL/SQL开发人员v10合作开发oracle11g数据库。 在我们的系统中,我们有一个问答表,我需要对每个客户回答的每个问题进行“展平” 一组问题在问题描述中有特定的代码(PIFQ),这使得下面的脚本成为可能。简单地UPPER(substr(q.questiondescription,1,6))然后关注可能的代码列表 select * from ( select tqs.transactiondeta

我正在与
PL/SQL开发人员v10
合作开发
oracle11g
数据库。
在我们的系统中,我们有一个问答表,我需要对每个客户回答的每个问题进行“展平”

一组问题在问题描述中有特定的代码(
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\u SUBSTR
来提取pivot的代码,并使用相同的逻辑来捕获
QDesc
。我们正在讨论100个问题,所以我宁愿避免列出代码

我一直在制作正则表达式(这只是从所有问题代码中选择正确问题代码的部分,但在我完成之后——这将是小菜一碟)。 我的ATM机是:

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

试试这个。使
可选。

这将起作用
”(WIF | DT | WT)[([:digit:][124;])]*”

结果:

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

跳过了DT和WT问题,但它肯定能用
点完成任务。你是冠军!谢谢。
(WIF|DT|WT)\d{1,2}.?
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