我试图解析的行是一系列仅由空格分隔的字符串值。示例如下: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.