web-dev-qa-db-fra.com

Comment extraire une partie d'une chaîne en t-sql

Si j'ai la variable nvarchar suivante - BTA200, comment puis-je en extraire uniquement le BTA?

De plus, si j'ai des longueurs variables telles que BTA50, BTA030, comment puis-je extraire uniquement la partie numérique?

20
Xaisoft

Je recommanderais une combinaison de PatIndex et Left. Construit avec soin, vous pouvez écrire une requête qui fonctionne toujours, quel que soit l'aspect de vos données.

Ex:

Declare @Temp Table(Data VarChar(20))

Insert Into @Temp Values('BTA200')
Insert Into @Temp Values('BTA50')
Insert Into @Temp Values('BTA030')
Insert Into @Temp Values('BTA')
Insert Into @Temp Values('123')
Insert Into @Temp Values('X999')

Select Data, Left(Data, PatIndex('%[0-9]%', Data + '1') - 1)
From   @Temp

PatIndex recherchera le premier caractère compris entre 0 et 9 et renverra sa position de caractère, que vous pouvez utiliser avec la fonction LEFT pour extraire les données correctes. Notez que PatIndex utilise réellement Data + '1'. Cela nous protège des données où aucun numéro n'a été trouvé. S'il n'y a pas de nombres, PatIndex retournerait 0. Dans ce cas, la fonction LEFT afficherait une erreur car nous utilisons Left (Data, PatIndex - 1). Lorsque PatIndex renvoie 0, nous nous retrouverions avec Left (Data, -1) qui renvoie une erreur.

Il y a encore des façons dont cela peut échouer. Pour une explication complète, je vous encourage à lire:

Extraction de nombres avec SQL Server

Cet article montre comment extraire des nombres d'une chaîne. Dans votre cas, vous souhaitez plutôt obtenir des caractères alpha. Cependant, le processus est suffisamment similaire pour que vous puissiez probablement en tirer quelque chose d'utile.

36
G Mastros

substring (field, 1,3) travaillera sur vos exemples.

select substring(field, 1,3) from table

De plus, si la partie alphabétique est de longueur variable, vous pouvez le faire pour extraire la partie alphabétique:

select substring(field, 1, PATINDEX('%[1234567890]%', field) -1) 
from table
where PATINDEX('%[1234567890]%', field) > 0
6
Stanislas Biron

LEFT ('BTA200', 3) fonctionnera pour les exemples que vous avez donnés, comme dans:

SELECT LEFT(MyField, 3)
FROM MyTable

Pour extraire la partie numérique, vous pouvez utiliser ce code

SELECT RIGHT(MyField, LEN(MyField) - 3)
FROM MyTable
WHERE MyField LIKE 'BTA%' 
--Only have this test if your data does not always start with BTA.
3
RB.
declare @data as varchar(50)
set @data='ciao335'


--get text
Select Left(@Data, PatIndex('%[0-9]%', @Data + '1') - 1)    ---->>ciao

--get numeric
Select right(@Data, len(@data) - (PatIndex('%[0-9]%', @Data )-1) )   ---->>335
1
Xilmiki