2016-08-07 8 views
2

私は私のコラムでは、このデータを持っている:部分文字列を使用してSQL Serverの一部を切り捨てますか?

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

この方法を試してみてください

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 

が最短の方法ではないかもしれませんが、ジョブが

0123を成し遂げる必要があります

注:SQL Serverで複雑な文字列操作を行う場合は、私は1つの方法は、計算を簡単にするためにouter applyを使用して、ハードコードの任意長ここ

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 

それは常にあなたが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 
+0

最後の 'Charindex'関数の2番目のパラメータが** missing ** –

+0

@Prdpありがとう、それを修正しました! – gofr1

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

をしませんでした:

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; 

私は計算を見つけます構築、追跡、デバッグが容易です。

関連する問題