Articles

Analyse syntaxique de base des chaînes de caractères

Posted on

Bien souvent, les requêtes T-SQL ne servent pas uniquement à compiler d’énormes ensembles de calculs d’agrégats ou de jointures et de stratégies d’indexation avancées. Parfois, vous avez besoin des compétences et des outils pour effectuer une analyse syntaxique de base des chaînes de caractères. Ici, vous apprendrez les fonctions d’analyse syntaxique de base des chaînes les plus courantes que l’on trouve dans T-SQL.

Certaines des fonctions de chaîne les plus utilisées sont les fonctions LEFT() et RIGHT() ainsi que SUBSTRING(). LEFT(a, n) renvoie les « n » premiers caractères de « a », comme on peut s’y attendre dans, disons, le Basic ou de nombreux autres langages de programmation. RIGHT(a, n) fonctionne de la même manière, mais la chaîne retournée est à « n » caractères de la fin. SUBSTRING(a, offset, length) correspond à la fonction Mid() du VisualBasic – elle renvoie la « longueur » des caractères de « a », en commençant à « offset ». LEN() renvoie la longueur d’une chaîne de caractères.

DECLARE @str varchar(100);SET @str='Another brown fox jumps over something';SELECT LEFT(@str, 7), SUBSTRING(@str, 15, 3), RIGHT(@str, 9), LEN(@str);

Trouver un caractère ou un joker

Il existe essentiellement deux fonctions différentes pour trouver une chaîne de caractères ou un joker dans T-SQL, CHARINDEX() et PATINDEX(). Elles fonctionnent à peu près de la même manière, mais la différence est que CHARINDEX(s, a) renvoie le premier décalage de la chaîne de caractères « s » dans « a », tandis que PATINDEX(s, a) renvoie le premier décalage où le caractère générique « s » est vrai dans « a ». Les caractères génériques utilisent la même syntaxe que celle utilisée dans une clause LIKE. Pour les deux fonctions, la valeur de retour 0 signifie qu’il n’y a pas eu de correspondance.

DECLARE @str varchar(100);SET @str='Another brown fox jumps over something';SELECT CHARINDEX('fox', @str), PATINDEX('%jump%', @str);

Division d’une valeur de chaîne

C’est essentiellement tout ce dont vous avez besoin pour diviser une chaîne en, disons, des mots.

DECLARE @str varchar(100), @offset int;SET @str='Another brown fox jumps over something';WHILE (@str!='') BEGIN; SET @offset=CHARINDEX(' ', @str+' '); SELECT LEFT(@str, @offset-1); SET @str=SUBSTRING(@str, @offset+1, LEN(@str));END;

Ce que fait la requête ci-dessus est :

  • Loop jusqu’à ce que @str soit vide.
  • Trouver le prochain espace (notez le @str+’ ‘. Ceci pour que nous trouvions le dernier mot, qui n’a pas d’espace de queue !)
  • Sélectionner tout ce qui se trouve à gauche de @str (nous utilisons @str-1, donc nous n’incluons pas l’espace lui-même)
  • Tronquer le début de @str avec @str+1 (pour inclure l’espace) caractères.
  • Lorsque nous avons tronqué le dernier mot de @str, la variable sera vide et la boucle s’arrêtera.

… ou avec une CTE récursive

Si vous voulez des points supplémentaires pour la finesse, utilisez une expression de table commune récursive.

DECLARE @str varchar(100), @offset int;SET @str='Another brown fox jumps over something';WITH words (word, str_remain)AS ( --- Anchor part SELECT CAST(NULL AS varchar(100)) AS word, @str AS str_remain UNION ALL --- Recursion SELECT LEFT(str_remain, CHARINDEX(' ', str_remain+' ')-1) AS word, SUBSTRING(str_remain, CHARINDEX(' ', str_remain+' ')+1, LEN(str_remain)) AS str_remain FROM words WHERE str_remain!='')SELECT wordFROM wordsWHERE word IS NOT NULL;

Les expressions récursives de table commune font l’objet d’un autre billet.

Share:

Imprimer

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *