繁体   English   中英

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

[英]Postgresql substring to extract between angle brackets and quotes

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

例如

我需要scale属性中的250。

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

我希望使用子字符串将其提取。 所以我做了:

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

这将返回250,这是我想要的。

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

所以我尝试了这个

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

它返回:

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+)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM