使用子字符串在SQL Server中削减部分值?

时间:2016-08-07 12:33:09

标签: sql-server substring

我的专栏中有这些数据:

32-HC-100-10001-G03P2-N-1-1001

问题是我的价值没有固定的长度。我需要做的是将此值拆分为2列32-HC-100-10001-G03P2-N1 - 最后-后的数字不重要

另一个例子

4-G-100-10029-F23S-S-2-1001

应分为4-G-100-10029-F23S-S2。我使用过SUBSTRING([Line No#], 0, 21),但由于它的长度不起作用。

4 个答案:

答案 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