如何在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
相关产品推荐
相关产品推荐

