REGEXP_SUBSTR - 如何在''之间return取值?
REGEXP_SUBSTR - How to return value between ' '?
我需要 return 来自下面字符串的 ' ' 的值(例如,对于 psOrderByClause 我需要值 xxx_seqno).此外,我还需要 return TRUE/FALSE 某些变量的值 - 没有单引号(例如 pbUseDisplayName 我需要 TRUE).
我不必在一个查询中,每个变量都应该有单独的查询(例如 psOrderByClause、psSeparator等等)
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
我需要 return 来自下面字符串的 ' ' 的值(例如,对于 psOrderByClause 我需要值 xxx_seqno).此外,我还需要 return TRUE/FALSE 某些变量的值 - 没有单引号(例如 pbUseDisplayName 我需要 TRUE).
我不必在一个查询中,每个变量都应该有单独的查询(例如 psOrderByClause、psSeparator等等)
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