TSQL如何提取字符串文本拆分为两列 并为第三列添加后缀
TSQL 实现代码
方案1:直接嵌套函数实现
SELECT SUBSTRING( Table_name, CHARINDEX('_', Table_name) + 1, CHARINDEX('.', Table_name) - CHARINDEX('_', Table_name) - 1 ) AS Landing_Schema_Name, SUBSTRING( Table_name, CHARINDEX('.', Table_name) + 1, LEN(Table_name) - CHARINDEX('.', Table_name) ) AS Raw_Table_Name, CONCAT( SUBSTRING( Table_name, CHARINDEX('.', Table_name) + 1, LEN(Table_name) - CHARINDEX('.', Table_name) ), '__GM' ) AS GM_Suffix_Table_Name FROM [e].[Load_History_test]
方案2:预计算分隔符位置(可读性更高)
如果需要处理大量数据或者后续要调整逻辑,推荐用CROSS APPLY提前计算分隔符位置,避免重复写相同的函数逻辑:
SELECT SUBSTRING(t.Table_name, p.underline_pos + 1, p.dot_pos - p.underline_pos - 1) AS Landing_Schema_Name, SUBSTRING(t.Table_name, p.dot_pos + 1, LEN(t.Table_name) - p.dot_pos) AS Raw_Table_Name, CONCAT(SUBSTRING(t.Table_name, p.dot_pos + 1, LEN(t.Table_name) - p.dot_pos), '__GM') AS GM_Suffix_Table_Name FROM [e].[Load_History_test] t CROSS APPLY ( SELECT CHARINDEX('_', t.Table_name) AS underline_pos, CHARINDEX('.', t.Table_name) AS dot_pos ) p
逻辑说明
你原有代码的问题是SUBSTRING的长度参数计算错误:你需要提取的是第一个下划线到第一个点之间的内容,所以长度应该是「点的索引 - 下划线的索引 - 1」,而不是总长度减去点的索引。
如果存在部分数据没有_或者.的异常场景,可以在CROSS APPLY中加CASE判断兼容异常值,避免SUBSTRING参数报错。
内容的提问来源于stack exchange,提问作者user2703679
相关产品推荐
相关产品推荐

