SQL Server 2017提取第11个¥后内容,求Oracle regexp_substr等效方法
SQL Server 2017提取第11个¥后的所有内容的实现方法
方法一:定位分隔符位置直接截取
通过多次调用CHARINDEX定位第11个¥的位置,再用SUBSTRING截取后续所有内容,结果与原字符串中第11个¥之后的内容完全一致(包含空分隔段和末尾的分隔符)。
DECLARE @targetStr NVARCHAR(MAX) = N'GSLO¥10-00950000207406¥61500¥CRS15596859¥20220714153630¥2022-07-14¥¥¥¥¥¥¥63031¥0¥¥79087¥6793¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥'; DECLARE @delimiter NCHAR(1) = N'¥'; -- 循环定位第11个分隔符的位置 DECLARE @splitPos INT = CHARINDEX(@delimiter, @targetStr); SELECT @splitPos = CHARINDEX(@delimiter, @targetStr, @splitPos + 1) FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS seq(n); -- 提取目标内容 SELECT SUBSTRING(@targetStr, @splitPos + 1, LEN(@targetStr) - @splitPos) AS ExtractedContent;
方法二:利用STRING_SPLIT和STRING_AGG拼接(需兼容级别130+)
SQL Server 2017及以上版本支持带ordinal参数的STRING_SPLIT,可按顺序拆分字符串,筛选出第12个及以后的片段后,用STRING_AGG拼接还原后续内容,结果与原字符串后续部分一致。
DECLARE @targetStr NVARCHAR(MAX) = N'GSLO¥10-00950000207406¥61500¥CRS15596859¥20220714153630¥2022-07-14¥¥¥¥¥¥¥63031¥0¥¥79087¥6793¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥'; DECLARE @delimiter NCHAR(1) = N'¥'; SELECT STRING_AGG(value, @delimiter) WITHIN GROUP (ORDER BY ordinal) AS ExtractedContent FROM STRING_SPLIT(@targetStr, @delimiter, 1) WHERE ordinal > 11;
与Oracle实现的对比
Oracle中用REGEXP_SUBSTR(str, '[^¥]+', 1, 12)可提取第12个分隔片段,但如果需要保留后续所有内容(包括空分隔段),上述SQL Server的两种方法更贴合需求:方法一直接截取的效率更高,方法二则更灵活,适合需要单独处理拆分后片段的场景。
内容的提问来源于stack exchange,提问作者asdaswsad
相关产品推荐
相关产品推荐

