要在尖括号和引号之间提取的 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+)
.
我有一个字段 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+)
.