簡體   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