[英]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.