SQL:使用regexp_substr或regexp_extract,寻找只返回一个字符和空格之间的字符串的regex模



我试图解析的行是一系列仅由空格分隔的字符串值。示例如下:TX:123 SP:XapZNsyeS INST:456123

我需要使用regexp_substr或regexp_extract仅返回出现在"TX:"之后的字符串的值。或"SP; "等等。本质上,一个表达式只捕获字符串之后的字符串(例如"TX:")和空格之前的字符串(")。

这是一种使用两个分隔符进行分割的方法。这适用于Oracle 12c,因为您包含了Oracle regexp-substr标签。使用with语句,首先设置原始数据,然后在空格或行尾进行分割,然后分成名称-值对。

WITH tbl_original_data(ID, str) AS (
SELECT 1, 'TX:123 SP:XapZNsyeS INST:456123' FROM dual UNION ALL
SELECT 2, 'MI:321 SP:MfeKLgkrJ INST:654321' FROM dual
),
tbl_split_on_space(ID, ELEMENT) AS (
SELECT ID,
REGEXP_SUBSTR(str, '(.*?)( |$)', 1, LEVEL, NULL, 1) 
FROM tbl_original_data
CONNECT BY REGEXP_SUBSTR(str, '(.*?)( |$)', 1, LEVEL) IS NOT NULL 
AND PRIOR ID = ID
AND PRIOR SYS_GUID() IS NOT NULL        
)  
--SELECT * FROM tbl_split_on_space;   
SELECT ID,
REGEXP_REPLACE(ELEMENT, '^(.*):.*', '1') NAME,
REGEXP_REPLACE(ELEMENT, '.*:(.*)$', '1') VALUE
FROM tbl_split_on_space;
ID NAME       VALUE     
---------- ---------- ----------
1 TX         123       
1 SP         XapZNsyeS 
1 INST       456123    
2 MI         321       
2 SP         MfeKLgkrJ 
2 INST       654321    
6 rows selected.

编辑:意识到这个答案比要求的要多一点,这里有一个简化的答案来返回一个元素。如果元素位于行尾,也不要忘记考虑空格的结束或行尾。

WITH tbl_original_data(ID, str) AS (
SELECT 1, 'TX:123 SP:XapZNsyeS INST:456123' FROM dual
)
SELECT REGEXP_SUBSTR(str, '.*?TX:(.*)( |$)', 1, 1, NULL, 1) TX_VALUE
FROM tbl_original_data;
TX_VALUE
--------
123     
1 row selected.

相关内容

  • 没有找到相关文章

最新更新