J'ai ces données dans ma colonne:
32-HC-100-10001-G03P2-N-1-1001
Le problème est que ma valeur n'a pas de longueur fixe. Ce que je dois faire est de split cette valeur en 2 colonnes 32-HC-100-10001-G03P2-N
et 1
– les numbers après la dernière -
ne sont pas importants
Un autre exemple
4-G-100-10029-F23S-S-2-1001
devrait être divisé en 4-G-100-10029-F23S-S
et 2
. J'ai utilisé SUBSTRING([Line No#], 0, 21)
mais à cause de la longueur, cela n'a pas fonctionné.
Essayez de cette façon
declare @str varchar(100)=reverse('4-G-100-10029-F23S-S-2-1001') select reverse(subssortingng(@str,charindex('-',@str)+1,len(@str))) as first_col, left(subssortingng(@str,charindex('-',@str)+1,len(@str)),charindex('-',subssortingng(@str,charindex('-',@str)+1,len(@str)))-1) as second_col
Peut ne pas être la méthode la plus courte mais devrait faire le travail
Note: je n'ai pas durci le code ici
Tant que la dernière partie (1-1001,2-2002 …) aura le même nombre de valeurs, cela fonctionnera.
declare @ssortingng varchar(max) set @ssortingng='32-HC-100-10001-G03P2-N-1-1001' select replace(@ssortingng, right(@ssortingng,7),''),subssortingng(right(@ssortingng,6),1,1)
Sortie:
32-HC-100-10001-G03P2-N 1
Lorsque vous effectuez des opérations de string complexes dans SQL Server, une méthode utilise outer apply
pour simplifier les calculs:
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;
Je trouve les calculs plus faciles à build, à suivre et à déboguer.
Vous pouvez essayer ceci:
DECLARE @ssortingng nvarchar(max) = '32-HC-100-10001-G03P2-N-1-1001' SELECT REVERSE(STUFF(SUBSTRING(REVERSE(@ssortingng),CHARINDEX('-',REVERSE(@ssortingng))+1,LEN(@ssortingng)),1,CHARINDEX('-',SUBSTRING(REVERSE(@ssortingng),CHARINDEX('-',REVERSE(@ssortingng))+1,LEN(@ssortingng))),'')), REVERSE(LEFT(SUBSTRING(REVERSE(@ssortingng),CHARINDEX('-',REVERSE(@ssortingng))+1,LEN(@ssortingng)),CHARINDEX('-',SUBSTRING(REVERSE(@ssortingng),CHARINDEX('-',REVERSE(@ssortingng)),LEN(@ssortingng)))))
Sortie:
32-HC-100-10001-G03P2-N 1
S'il s'agit toujours d'une 7ème partie, vous pouvez utiliser XML:
DECLARE @ssortingng nvarchar(max) = '32-HC-100-10001-G03P2-N-1-1001', @xml xml SELECT @xml = CAST('<d>'+REPLACE(@ssortingng,'-','</d><d>') +'</d>' as xml) SELECT tvvalue('/d[1]','nvarchar(10)') + '-' + tvvalue('/d[2]','nvarchar(10)') + '-' + tvvalue('/d[3]','nvarchar(10)') + '-' + tvvalue('/d[4]','nvarchar(10)') + '-' + tvvalue('/d[5]','nvarchar(10)') + '-' + tvvalue('/d[6]','nvarchar(10)'), tvvalue('/d[7]','nvarchar(10)') FROM @xml.nodes('/') as t(v)
Sortie:
32-HC-100-10001-G03P2-N 1