要在尖括号和引号之间提取的 Postgresql 子字符串

Postgresql substring to extract between angle brackets and quotes

我有一个字段 xml。我正在尝试从一个属性中提取数据,该属性后跟位于元素开始标记末尾的 >

例如

我需要比例属性中的 250。

<Request id=""1111"" order=""123456"" scale=""250""><Project file=""test.txt""/></Request>

我想使用子字符串提取它。所以我做了:

select substring(myxml from '%scale="#"%#""><Pro%' for '#') from mytable

这个returns250就是我想要的

但是,问题是其他记录的下一个元素并不总是以 <Pro

开头

所以我尝试了这个

select substring(myxml from '%scale="#"%#""><%' for '#') from mytable

它returns:

250"><Project file="test.txt"/></Request>

我哪里错了?有没有更好的办法? 非常感谢。

如果你总是确定你在 Request 元素中的 scale 属性之后,那么这可能对你有用(我只在 PG 9.3.5 上试过):

SELECT (regexp_matches(myxml, '<Request[^>]*?\s+scale=""(\d+)""'))[1] AS scale FROM mytable;

一些人为的模拟数据(我改变了 scale 值和内部元素名称)作为演示:

postgres=# SELECT * FROM mytable;
                                             myxml                                         
-----------------------------------------------------------------------------------------------
 <Request id=""1111"" order=""123456"" scale=""250""><Project file=""test.txt""/></Request>
 <Request id=""1111"" order=""123456"" scale=""250""><Notproject file=""test.txt""/></Request>
 <Request id=""1111"" order=""123456"" scale=""253""><Notproject file=""test.txt""/></Request>
(3 rows)

postgres=# SELECT (regexp_matches(myxml, '<Request[^>]*?\s+scale=""(\d+)""'))[1] AS scale FROM mytable;
 scale
-------
 250
 250
 253
(3 rows)

我在上面使用的正则表达式期望 scale 的值完全由数字组成。如果您的数据可能比这更多样化,则捕获部分可能需要类似于 ([^"]+) 而不是 (\d+).