我的专栏中有这些数据:
32-HC-100-10001-G03P2-N-1-1001
问题是我的价值没有固定的长度。我需要做的是将此值拆分为2列32-HC-100-10001-G03P2-N
和1
- 最后-
后的数字不重要
另一个例子
4-G-100-10029-F23S-S-2-1001
应分为4-G-100-10029-F23S-S
和2
。我使用过SUBSTRING([Line No#], 0, 21)
,但由于它的长度不起作用。
答案 0 :(得分:4)
试试这种方式
declare @str varchar(100)=reverse('4-G-100-10029-F23S-S-2-1001')
select reverse(substring(@str,charindex('-',@str)+1,len(@str))) as first_col,
left(substring(@str,charindex('-',@str)+1,len(@str)),charindex('-',substring(@str,charindex('-',@str)+1,len(@str)))-1) as second_col
可能不是最短的方法,但应该完成工作
注意:我没有硬编码任何长度
答案 1 :(得分:2)
只要最后一部分(1-1001,2-2002 ......)具有相同数量的值,这将有效..
declare @string varchar(max)
set @string='32-HC-100-10001-G03P2-N-1-1001'
select replace(@string, right(@string,7),''),substring(right(@string,6),1,1)
<强>输出:强>
32-HC-100-10001-G03P2-N 1
答案 2 :(得分:2)
在SQL Server中执行复杂的字符串操作时,一种方法使用outer apply
来简化计算:
select t.col, s2.firstpart, s2.secondpart
from t outer apply
(select left(col, len(col) - charindex('-', reverse(col)) as s1
-- remove the last number
) s1 outer apply
(select left(s1, len(s1) - charindex('-', reverse(s1)) as firstpart,
right(s1, charindex('-', reverse(s1)) -1) as secondpart
) s2;
我发现计算更容易构建,跟踪和调试。
答案 3 :(得分:1)
你可以试试这个:
DECLARE @string nvarchar(max) = '32-HC-100-10001-G03P2-N-1-1001'
SELECT REVERSE(STUFF(SUBSTRING(REVERSE(@string),CHARINDEX('-',REVERSE(@string))+1,LEN(@string)),1,CHARINDEX('-',SUBSTRING(REVERSE(@string),CHARINDEX('-',REVERSE(@string))+1,LEN(@string))),'')),
REVERSE(LEFT(SUBSTRING(REVERSE(@string),CHARINDEX('-',REVERSE(@string))+1,LEN(@string)),CHARINDEX('-',SUBSTRING(REVERSE(@string),CHARINDEX('-',REVERSE(@string)),LEN(@string)))))
输出:
32-HC-100-10001-G03P2-N 1
如果它总是作为第7部分出现,您可以使用XML:
DECLARE @string nvarchar(max) = '32-HC-100-10001-G03P2-N-1-1001',
@xml xml
SELECT @xml = CAST('<d>'+REPLACE(@string,'-','</d><d>') +'</d>' as xml)
SELECT t.v.value('/d[1]','nvarchar(10)') + '-' +
t.v.value('/d[2]','nvarchar(10)') + '-' +
t.v.value('/d[3]','nvarchar(10)') + '-' +
t.v.value('/d[4]','nvarchar(10)') + '-' +
t.v.value('/d[5]','nvarchar(10)') + '-' +
t.v.value('/d[6]','nvarchar(10)'),
t.v.value('/d[7]','nvarchar(10)')
FROM @xml.nodes('/') as t(v)
输出:
32-HC-100-10001-G03P2-N 1