Maison >base de données >tutoriel mysql >Comment gérer les délimiteurs manquants lors du fractionnement de chaînes dans T-SQL ?

Comment gérer les délimiteurs manquants lors du fractionnement de chaînes dans T-SQL ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-08 09:47:42251parcourir

How to Handle Missing Delimiters When Splitting Strings in T-SQL?

Fréparation de chaînes T-SQL : résolution des délimiteurs manquants

Les données avec des délimiteurs incohérents nécessitent une gestion robuste des scénarios de délimiteurs manquants. Examinons un problème courant :

Imaginez une table ("MaTable") avec une colonne "Nom" stockant les noms au format FirstName/LastName. Cependant, certaines entrées peuvent ne pas comporter le délimiteur « / » :

<code>FirstName---LastName
John--------Smith
Jane--------Doe
Steve-------NULL  -- Missing delimiter
Bob---------Johnson</code>

Une approche naïve SUBSTRING et CHARINDEX comme celle-ci échoue lorsqu'un délimiteur est absent :

<code class="language-sql">SELECT 
    SUBSTRING(Name, 1, CHARINDEX('/', Name)-1) AS FirstName,
    SUBSTRING(Name, CHARINDEX('/', Name) + 1, 1000) AS LastName
FROM MyTable;</code>

L'erreur « Paramètre de longueur non valide transmis à la fonction LEFT ou SUBSTRING » se produit car CHARINDEX renvoie 0 lorsque le délimiteur n'est pas trouvé, ce qui entraîne une longueur de sous-chaîne négative.

La solution : extraction conditionnelle de sous-chaînes

La solution implique une instruction CASE pour déterminer conditionnellement la longueur de la sous-chaîne :

<code class="language-sql">SELECT 
    SUBSTRING(Name, 1, CASE WHEN CHARINDEX('/', Name) = 0 THEN LEN(Name) ELSE CHARINDEX('/', Name) - 1 END) AS FirstName,
    SUBSTRING(Name, CASE WHEN CHARINDEX('/', Name) = 0 THEN LEN(Name) + 1 ELSE CHARINDEX('/', Name) + 1 END, 1000) AS LastName
FROM MyTable;</code>

Cette requête affinée utilise CASE pour gérer les deux scénarios :

  • Délimiteur absent (CHARINDEX('/') = 0) : La longueur de la sous-chaîne pour FirstName devient la longueur entière de la chaîne (LEN(Name)), et la sous-chaîne LastName commence à une position un caractère au-delà de la fin de la chaîne (LEN(Name) 1), renvoyant effectivement NULL.
  • Délimiteur présent : La logique SUBSTRING originale est appliquée.

Cette approche robuste garantit des résultats corrects quelle que soit la présence d'un délimiteur, évitant ainsi l'erreur « Paramètre de longueur invalide ».

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn