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
Libérer: 2025-01-08 09:47:42
original
230 Les gens l'ont consulté

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>
Copier après la connexion

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

SELECT 
    SUBSTRING(Name, 1, CHARINDEX('/', Name)-1) AS FirstName,
    SUBSTRING(Name, CHARINDEX('/', Name) + 1, 1000) AS LastName
FROM MyTable;
Copier après la connexion

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 :

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;
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal