0

我们在数据库中存储了一些应用程序参数,我正在寻找一种通过 SQL 提取/解析参数的方法。该数据的一个示例如下:

PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]

因此,例如 Projection 的值将是“Transverse”,而引号将是其中的一部分。我认为解决这个问题的最简单方法是使用 REGEXP_SUBSTR 函数。这是我目前的尝试:

SELECT REGEXP_SUBSTR('PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]', 'PROJECTION\[[^][]*\]') FROM dual;

虽然返回:

PROJECTION["Transverse"]

我意识到我可以删除不需要的字符,但我很好奇是否有人可以推荐任何 REGEX 调整,以便 SELECT 查询在此示例中仅返回“Transverse”。投影并不总是我想要拉出的,例如,如果我想要 Unit 那么我需要返回:“Two”,2

这是使用 Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi

4

3 回答 3

1
SELECT REGEXP_REPLACE(
   'PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]',
   '^.*PROJECTION\[(.+?)\].*$', '\1'
) FROM dual
于 2013-05-22T21:11:52.650 回答
0

您可以为此使用反向引用(\1\2等)。基本上你想匹配字符串的三个部分:

  1. PROJECTION参数值之前的所有内容。
  2. PROJECTION参数值。
  3. PROJECTION参数值之后的所有内容。

这三个匹配的正则表达式必须在括号内才能使反向引用起作用。我想出的正则表达式是这样的:

(.*PROJECTION\[")(.+)("].*)
                     ^^^^^^ Backref 3: everything after the PROJECTION parameter value
                 ^^^^ Backref 2: the PROJECTION parameter value
^^^^^^^^^^^^^^^^^ Backref 1: everything before the PROJECTION parameter value

然后只需用 backref 2 替换,忽略 1 和 3:

REGEXP_REPLACE(expr, '(.*PROJECTION\[")(.+)("].*)', '\2')
于 2013-05-22T21:12:37.447 回答
0
SELECT REGEXP_SUBSTR('PROJS["AA",ZZZZ[PARAMETER["One",1]],PROJECTION["Transverse"],UNIT["Two",2]]', 'PROJECTION\[([^][]*)\]', 1, 1, null, 1) FROM dual;
于 2019-02-11T12:46:08.667 回答