问题描述
我需要从字符串下方的 ' ' 返回值(例如,对于 psOrderByClause,我需要值 xxx_seqno)。此外,我还需要为某些变量返回 TRUE/FALSE 值 - 没有单引号(例如,pbUsedisplayName 我需要 TRUE)。
我不必在一个查询中,每个变量都应该有单独的查询(例如,psOrderByClause、psSeparator 等)
prcCSVGenerator(pnRunKey => pnRunKey,pnConfigKey => pnConfigKey,psOrderByClause => 'xxx_seqno',psSeparator => '|',pbUsedisplayName => TRUE,pbUseWindowSEOL => TRUE);
例如从上面的字符串我需要在一个查询中返回 xxx_seqno 和TRUE另一个
并不总是像上面那样的“空格”,有时看起来像“psOrderByClause=> 'xxx_seqno'”或“psOrderByClause=>'xxx_seqno'” >
我感觉 Regex 不太好,我只有这样的东西,但这会返回 psSeparator 之后的所有字符
REGEXP_SUBSTR (text,'(psSeparator)(.*)',1,'i',2) 正则表达式
有人可以帮我吗?
谢谢
解决方法
您可以使用:
SELECT REGEXP_SUBSTR(
value,q'[psOrderByClause\s*=>\s*('(''|[^'])*'|.*?)\s*(,|\))]',1,'i',1
) AS psOrderByClause,REGEXP_SUBSTR(
value,q'[psSeparator\s*=>\s*('(''|[^'])*'|.*?)\s*(,1
) AS psSeparator,q'[pbUseDisplayName\s*=>\s*('(''|[^'])*'|.*?)\s*(,1
) AS pbUseDisplayName,q'[pbUseWindowsEOL\s*=>\s*('(''|[^'])*'|.*?)\s*(,1
) AS pbUseWindowsEOL
FROM table_name
对于样本数据:
CREATE TABLE table_name ( value ) AS
SELECT 'prcCSVGenerator(pnRunKey => pnRunKey,pnConfigKey => pnConfigKey,psOrderByClause => ''xxx_seqno'',psSeparator => ''|'',pbUseDisplayName => TRUE,pbUseWindowsEOL => TRUE);' FROM DUAL
输出:
PSORDERBYCLAUSE | PSSEPARATOR | PBUSEDISPLAYNAME | PBUSEWINDOWSEOL |
---|---|---|---|
'xxx_seqno' | '|' | 真的 | 真的 |
如果您不想要周围的引号,则可以根据需要修剪它们。
dbfiddle here