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