Comment extraire cette sous-string spécifique dans SQL Server?

J'ai une string avec un motif spécifique:

23;chair,red [$3] 

c'est-à-dire, un nombre suivi d'un point-virgule, puis un nom suivi d'un crochet carré gauche.

En supposant le point-virgule ; existe toujours et la parenthèse gauche [ existe toujours dans la string, comment puis-je extraire le text entre (et non compris) le ; et le [ dans une requête SQL Server? Merci.

Combinez les fonctions SUBSTRING() , LEFT() et CHARINDEX() .

 SELECT LEFT(SUBSTRING(YOUR_FIELD, CHARINDEX(';', YOUR_FIELD) + 1, 100), CHARINDEX('[', YOUR_FIELD) - 1) FROM YOUR_TABLE; 

Cela suppose que la longueur de votre champ ne dépassera jamais 100, mais vous pouvez le rendre plus intelligent pour en tenir count si nécessaire en utilisant la fonction LEN() . Je n'ai pas pris la peine car il y en a déjà assez là-bas, et je n'ai pas d'instance à tester, donc je ne fais que regarder mes parenthèses, etc.

En supposant qu'ils existent toujours et ne font pas partie de vos données, cela fonctionnera:

 declare @ssortingng varchar(8000) = '23;chair,red [$3]' select subssortingng(@ssortingng, charindex(';', @ssortingng) + 1, charindex(' [', @ssortingng) - charindex(';', @ssortingng) - 1) 

Une alternative à la réponse fournie par @Marc

 SELECT SUBSTRING(LEFT(YOUR_FIELD, CHARINDEX('[', YOUR_FIELD) - 1), CHARINDEX(';', YOUR_FIELD) + 1, 100) FROM YOUR_TABLE WHERE CHARINDEX('[', YOUR_FIELD) > 0 AND CHARINDEX(';', YOUR_FIELD) > 0; 

Ceci s'assure que les délimiteurs existent et résout un problème avec la réponse actuellement acceptée où faire LEFT en dernier travaille avec la position du dernier délimiteur dans la string d'origine, plutôt qu'avec la sous-string révisée.

Si vous devez split quelque chose en 3 morceaux, comme une adresse e-mail et que vous ne connaissez pas la longueur de la partie du milieu, essayez ceci (je l'ai juste couru sur sqlserver 2012 donc je sais que ça marche):

 SELECT top 2000 emailaddr_ as email, SUBSTRING(emailaddr_, 1,CHARINDEX('@',emailaddr_) -1) as username, SUBSTRING(emailaddr_, CHARINDEX('@',emailaddr_)+1, (LEN(emailaddr_) - charindex('@',emailaddr_) - charindex('.',reverse(emailaddr_)) )) domain FROM emailTable WHERE charindex('@',emailaddr_)>0 AND charindex('.',emailaddr_)>0; GO 

J'espère que cela t'aides.

select la sous-string (votre_file, CHARINDEX (';', votre_file) +1, CHARINDEX ('[', votre_file) -CHARINDEX (';', votre_file) -1) de votre_table

Impossible de faire travailler les autres. Je crois que vous voulez juste ce qui est entre ';' et '[' dans tous les cas quelle que soit la longueur de la string entre. Après avoir spécifié le champ dans la fonction de sous-string, le deuxième argument est l'location de départ de ce que vous allez extraire. C'est, où le ';' est + 1 (quasortingème position – le c), parce que vous ne voulez pas inclure ';'. L'argument suivant prend l'location du '[' (position 14) et soustrait l'location du point après le ';' (quasortingème position – c'est pourquoi je soustrais maintenant 1 dans la requête). Cela dit fondamentalement subssortingng (champ, location que je veux que la sous-string commence, combien de time je veux que la sous-string soit). J'ai utilisé cette même fonction dans d'autres cas. Si certains des champs n'ont pas ';' et '[', vous voudrez filterr ceux dans la clause "où", mais c'est un peu différent de la question. Si ton ';' était dit … ';;;', vous utiliseriez 3 au lieu de 1 dans l'exemple. J'espère que cela t'aides!