提取複雜的文本模式我需要提取文本模式看起來像這樣:使用SQL函數
NN-NNN-NNNNNNNNN
(2digit,minus, 3digits,minus,9digits)
沿文本字段。例如,具體字段如下所示:
"fsadlk fasldkl jhkjfd khjfasd 11-333-878787618 hfsd uhjkfads"
我需要在選擇行中使用sql函數提取11-333-878787618。我正在使用DB2 AS400,但任何SQL函數語法都會有所幫助。
提取複雜的文本模式我需要提取文本模式看起來像這樣:使用SQL函數
NN-NNN-NNNNNNNNN
(2digit,minus, 3digits,minus,9digits)
沿文本字段。例如,具體字段如下所示:
"fsadlk fasldkl jhkjfd khjfasd 11-333-878787618 hfsd uhjkfads"
我需要在選擇行中使用sql函數提取11-333-878787618。我正在使用DB2 AS400,但任何SQL函數語法都會有所幫助。
以下內容在這方面可能有用;我可以添加提取爲好,但我想,可能已經瞭解,得到這個地步後:
create table patterns (p varchar(65), find_at smallint)
;
insert into patterns values
('fsadlk fasldkl jhkjfd khjfasd 11-333-878787618 hfsd uhjkfads',31)
,('weroiu 11-333-8787zz618 oiuwens snkdl osjlwhe' ,00)
,('nm,sdj xhdgweufyen sndh 711-333-878787618 hfsd uhjkfads' ,26)
,('nm,sdj xhdgweufyen sndh 11-333-8787876187 hfsd uhjkfads' ,25)
-- ....+....1....+....2....+....3....+....4....+....5....+....6.
;
select translate(p, '9', '', '9') as translated
, smallint(locate('99-999-999999999'
, translate(p, '9', '', '9'))
) as located
, find_at
from patterns
; -- report from the above query follows:
TRANSLATED LOCATED FIND_AT
fsadlk fasldkl jhkjfd khjfasd 99-999-999999999 hfsd uhjkfads 31 31
weroiu 99-999-9999zz999 oiuwens snkdl osjlwhe 0 0
nm,sdj xhdgweufyen sndh 999-999-999999999 hfsd uhjkfads 26 26
nm,sdj xhdgweufyen sndh 99-999-9999999999 hfsd uhjkfads 25 25
Works令人驚歎!非常感謝你! –
沒有內置的SQL函數來爲您提供您正在嘗試完成的任務。我建議你看看this。這是一篇關於如何使用用戶定義函數在iSeries DB2 SQL上執行正則表達式的IBM文章。然後正則表達式匹配的文本是:
\d\d-\d\d\d-\d\d\d\d\d\d\d\d\d
這將是很好用的適當正則表達式模式:
\d{2}-\d{3}-\d{9}
但是,IBM實現是相當有限的這個表達式功能。
根據此處的文檔https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzregexp_like.htm,{n}修飾符應至少在v7.1及更高版本上運行。真正的警告是必須安裝Unicode的國際組件。我沒有安裝在這裏,所以我無法測試這個。您正在查找的DB2函數是「REGEXP_LIKE」。 – jmarkmurphy
如果您正在爲IBM i尋找ICU,那麼它是操作系統的選項39。 – jmarkmurphy
非常感謝!正則表達式非常強大,雖然我無法在我的iSerious SQL環境中運行它 –
請標記與您正在使用的數據庫你的問題。另外,編輯問題並提供樣本數據和期望的結果。 –
還要添加一些示例表格數據和預期結果。 – jarlh