REGEXP_SUBSTR - 如何在''之间return取值?

REGEXP_SUBSTR - How to return value between ' '?

我需要 return 来自下面字符串的 ' ' 的值(例如,对于 psOrderByClause 我需要值 xxx_seqno).此外,我还需要 return TRUE/FALSE 某些变量的值 - 没有单引号(例如 pbUseDisplayName 我需要 TRUE).

我不必在一个查询中,每个变量都应该有单独的查询(例如 psOrderByClausepsSeparator等等)

prcCSVGenerator(pnRunKey => pnRunKey, pnConfigKey => pnConfigKey, psOrderByClause => 'xxx_seqno', psSeparator => '|', pbUseDisplayName => TRUE, pbUseWindowsEOL => TRUE);

例如,从上面的字符串中,我需要在一个查询中 return xxx_seqno TRUE 另一个

并不总是像上面那样'spaces',有时看起来像“psOrderByClause=> 'xxx_seqno'”或“psOrderByClause= >'xxx_seqno'"

我对 Regex 感觉不太好,我只有这样的东西,但是这 return 是 psSeparator

之后的所有字符

REGEXP_SUBSTR (text,'(psSeparator)(.*)',1,1,'i',2) regex

有人可以帮我吗?

谢谢

您可以使用:

SELECT REGEXP_SUBSTR(
         value,
         q'[psOrderByClause\s*=>\s*('(''|[^'])*'|.*?)\s*(,|\))]',
         1,
         1,
         'i',
         1
       ) AS psOrderByClause,
       REGEXP_SUBSTR(
         value,
         q'[psSeparator\s*=>\s*('(''|[^'])*'|.*?)\s*(,|\))]',
         1,
         1,
         'i',
         1
       ) AS psSeparator,
       REGEXP_SUBSTR(
         value,
         q'[pbUseDisplayName\s*=>\s*('(''|[^'])*'|.*?)\s*(,|\))]',
         1,
         1,
         'i',
         1
       ) AS pbUseDisplayName,
       REGEXP_SUBSTR(
         value,
         q'[pbUseWindowsEOL\s*=>\s*('(''|[^'])*'|.*?)\s*(,|\))]',
         1,
         1,
         'i',
         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' '|' TRUE TRUE

如果您不想要周围的引号,那么您可以 trim 根据需要添加它们。

db<>fiddle here