You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:45:02