Teradata中提取逗号分隔字符串指定位置值的方法咨询
在Teradata中提取指定逗号间的值(含空值场景)
无需借助Python,Teradata本身可以通过两种方法实现提取第5个与第6个逗号之间的值,解决STRTOK()跳过空值不计数的问题:
方法1:使用正则表达式函数REGEXP_SUBSTR
利用正则匹配包含空值的分隔段,精准定位目标区间:
SELECT REGEXP_SUBSTR('1,,,,,012345678,abcdzyz,,,,,,', '^(?:[^,]*,){5}([^,]*)', 1, 1, 'i', 1) AS extracted_value;
正则逻辑说明:
^(?:[^,]*,){5}:从字符串开头匹配5组「任意非逗号字符+逗号」,跳过前5个逗号分隔的区间(含空值)([^,]*):捕获第5个逗号后到第6个逗号前的所有内容(包括空值)- 最后一个参数
1表示返回第一个捕获组的结果
执行该语句会返回012345678,符合需求。
方法2:使用POSITION结合SUBSTRING手动定位
通过嵌套POSITION找到第5、6个逗号的位置,再截取区间内容:
WITH input_str AS ( SELECT '1,,,,,012345678,abcdzyz,,,,,,', AS str ) SELECT CASE WHEN pos6 > 0 THEN SUBSTRING(str FROM pos5 + 1 FOR pos6 - pos5 - 1) ELSE SUBSTRING(str FROM pos5 + 1) END AS extracted_value FROM input_str CROSS JOIN ( SELECT POSITION(',', str, 1, 5) AS pos5, POSITION(',', str, 1, 6) AS pos6 FROM input_str ) AS pos;
逻辑说明:
POSITION(',', str, 1, 5):获取第5个逗号的位置POSITION(',', str, 1, 6):获取第6个逗号的位置- 通过
CASE处理两种场景:存在第6个逗号时截取中间内容,不存在则截取到字符串结尾
内容的提问来源于stack exchange,提问作者Larry Burholme
相关产品推荐
相关产品推荐

