Oracle中提取@分隔字符串指定位置值(含空值处理)
Oracle中提取@分隔字符串指定位置值(空段视为NULL)
在Oracle中,要提取以@分隔的字符串指定位置的值,且将连续@@之间的空内容视为NULL,可以结合REGEXP_SUBSTR和NULLIF函数实现。REGEXP_SUBSTR的特定正则模式能精准捕获每个分隔段(包括空段),再通过NULLIF将空字符串转换为NULL。
核心实现逻辑
使用正则表达式'(.*?)(@|$)'匹配每个@分隔的片段:
.*?:非贪婪匹配任意字符(包括空内容)(@|$):匹配分隔符@或字符串结尾
通过REGEXP_SUBSTR的参数指定提取第N个片段,再用NULLIF(提取结果, '')将空字符串转为NULL。
示例SQL语句
假设待处理字符串存储在表test_table的target_str字段中,提取第3、4、5、7位值的SQL如下:
SELECT NULLIF(REGEXP_SUBSTR(target_str, '(.*?)(@|$)', 1, 3, NULL, 1), '') AS pos3, NULLIF(REGEXP_SUBSTR(target_str, '(.*?)(@|$)', 1, 4, NULL, 1), '') AS pos4, NULLIF(REGEXP_SUBSTR(target_str, '(.*?)(@|$)', 1, 5, NULL, 1), '') AS pos5, NULLIF(REGEXP_SUBSTR(target_str, '(.*?)(@|$)', 1, 7, NULL, 1), '') AS pos7 FROM test_table;
验证示例结果
示例1
输入字符串:N@@N@14/12/2023@WAN HAI 325@@05/01/2024@19/01/2024@29/12/2023@@@@
执行SQL后输出:
- pos3:
14/12/2023 - pos4:
WAN HAI 325 - pos5:
NULL - pos7:
19/01/2024
示例2
输入字符串:N@@N@06/10/23@@2310206@17/11/23@30/11/2023@11/10/23@@@@@@@@
执行SQL后输出:
- pos3:
06/10/23 - pos4:
NULL - pos5:
2310206 - pos7:
30/11/2023
内容的提问来源于stack exchange,提问作者Sathish Kumar
相关产品推荐
相关产品推荐

