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 :
SELECT SUBSTRING(Name, 1, CHARINDEX('/', Name)-1) AS FirstName, SUBSTRING(Name, CHARINDEX('/', Name) + 1, 1000) AS LastName FROM MyTable;
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;
Cette requête affinée utilise CASE
pour gérer les deux scénarios :
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
.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!