2 votes

Découper une partie d'une valeur dans SQL Server à l'aide de substring ?

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, c'est diviser cette valeur en 2 colonnes 32-HC-100-10001-G03P2-N y 1 - l'avant-dernier numéro - n'est pas important

Autre exemple

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

devrait être scindé en 4-G-100-10029-F23S-S y 2 . J'ai utilisé SUBSTRING([Line No#], 0, 21) mais en raison de la longueur, cela n'a pas fonctionné.

4voto

MotoGP Points 35270

Essayez cette méthode

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

Ce n'est peut-être pas la méthode la plus courte, mais elle devrait permettre de faire le travail.

Note : Je n'ai pas codé en dur longueur aquí

2voto

TheGameiswar Points 21

Tant que la dernière partie (1-1001, 2-2002...) a le même nombre de valeurs, cela fonctionnera...

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)

Sortie :

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

2voto

Gordon Linoff Points 213350

Lors d'opérations complexes sur les chaînes de caractères dans le serveur SQL, une méthode consiste à utiliser la fonction 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 que les calculs sont plus faciles à construire, à suivre et à déboguer.

1voto

gofr1 Points 13671

Vous pouvez essayer ceci :

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)))))

Sortie :

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

S'il s'agit toujours d'une 7e pièce, vous pouvez utiliser 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)

Sortie :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X