【问题标题】:Postgresql substring to extract between angle brackets and quotesPostgresql子字符串在尖括号和引号之间提取
【发布时间】:2015-01-22 17:02:27
【问题描述】:

我有一个包含 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,这是我想要的。

但是,问题是其他记录的下一个元素并不总是以&lt;Pro开头

所以我尝试了这个

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

返回:

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

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

【问题讨论】:

  • ""foobar"" 是错别字吗?双引号好像太多了
  • 不是错别字。这就是数据被格式化并插入到字段中的方式。
  • 这不是有效的 XML
  • 正确。这就是它的存储方式。出于某种原因,它被故意操纵为双引号。
  • 你能解释一下这个原因吗?我想知道为什么需要生成错误的 XML。

标签: sql postgresql pattern-matching substring


【解决方案1】:

如果您始终确定您在 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+)

【讨论】:

  • 谢谢rchang!我有点傻了,而不是 (\d+) 我用 ([0-9]*)
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 2012-09-05
相关资源
最近更新 更多