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

如何在SQL Server中用分隔符'-'拆分列生成新列?

在SQL Server中按'-'拆分列生成新列的解决方法

你的PARSENAME用法错误,因为PARSENAME默认仅按.拆分字符串,且参数顺序不符合要求(它的第二个参数是要提取的部分位置,不是分隔符),所以导致执行失败。以下是几种可行的实现方法:

方法1:替换分隔符后使用PARSENAME

先把-替换为PARSENAME识别的.,再按位置提取内容(注意PARSENAME是从右往左计数):

SELECT 
    ID,
    -- 若ID格式为XXX-EmployeeID,取1会得到最右侧的EmployeeID;如需提取最左侧部分,修改为对应位置数
    PARSENAME(REPLACE(ID, '-', '.'), 1) AS EmployeeID
FROM timeus;

示例:若ID为DEP001-E0023,替换后是DEP001.E0023,PARSENAME取1会得到E0023。

方法2:用CHARINDEX结合SUBSTRING(兼容所有SQL Server版本)

适合处理任意位置的拆分需求,比如提取第一个-左侧/右侧的内容:

提取第一个-左侧的内容

SELECT 
    ID,
    SUBSTRING(ID, 1, CHARINDEX('-', ID) - 1) AS EmployeeID
FROM timeus
WHERE CHARINDEX('-', ID) > 0; -- 过滤无分隔符的行,避免报错

提取第一个-右侧的内容

SELECT 
    ID,
    SUBSTRING(ID, CHARINDEX('-', ID) + 1, LEN(ID) - CHARINDEX('-', ID)) AS EmployeeID
FROM timeus
WHERE CHARINDEX('-', ID) > 0;

方法3:用STRING_SPLIT(SQL Server 2016及以上版本)

如果你的SQL Server版本是2022及以上,可直接利用ordinal参数指定提取第N个部分:

SELECT 
    t.ID,
    s.value AS EmployeeID
FROM timeus t
CROSS APPLY STRING_SPLIT(t.ID, '-') s
WHERE s.ordinal = 1; -- 1表示提取第一个分隔后的部分,按需修改数字

如果是2016-2019版本(无ordinal参数),可结合ROW_NUMBER()实现:

SELECT 
    ID,
    value AS EmployeeID
FROM (
    SELECT 
        ID,
        value,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT NULL)) AS rn
    FROM timeus
    CROSS APPLY STRING_SPLIT(ID, '-')
) AS temp
WHERE rn = 1; -- 指定提取第1个部分

内容的提问来源于stack exchange,提问作者sdh2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:10:28