-1
votes

Comment obtenir la 3ème partie de chaîne avec Charindex / Substring

Tout le monde, j'essaie de séparer une colonne Nom en 4 parties différentes. À l'heure actuelle, toutes les pièces de noms sont séparées par des espaces ». J'ai des problèmes avec mon @ThirdString peuplant la quatrième partie du nom (généralement un suffixe) que je veux être considéré comme le @fourThstring. Je vais l'exécuter avec des noms différents de différentes longueurs. J'utilise simplement l'exemple de Robert Dobson Bud Jr. Les autres noms pourraient être deux parties ou plus. xxx

i Voudrais se débarrasser de la JR dans la 3ème colonne. L'intention est d'avoir 4 colonnes différentes avec 4 parties différentes du nom.


4 Réponses :


0
votes

Utilisation d'une fonction de division, cela peut être agencé très simplement.

CREATE FUNCTION [dbo].[DelimitedSplit8K_LEAD]  
--===== Define I/O parameters  
        (@pString VARCHAR(8000), @pDelimiter CHAR(1))  
RETURNS TABLE WITH SCHEMABINDING AS  
 RETURN  
--===== "Inline" CTE Driven "Tally Table” produces values from 0 up to 10,000...  
     -- enough to cover VARCHAR(8000)  
 WITH E1(N) AS (  
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL   
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL   
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1  
                ),                          --10E+1 or 10 rows  
       E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows  
       E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max  
 cteTally(N) AS (--==== This provides the "zero base" and limits the number of rows right up front  
                     -- for both a performance gain and prevention of accidental "overruns"  
                 SELECT 0 UNION ALL  
                 SELECT TOP (DATALENGTH(ISNULL(@pString,1))) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4  
                ),  
cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter)  
                 SELECT t.N+1  
                   FROM cteTally t  
                  WHERE (SUBSTRING(@pString,t.N,1) = @pDelimiter OR t.N = 0)   
                )  
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found.  
 SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY s.N1),  
        Item = SUBSTRING(@pString,s.N1,ISNULL(NULLIF((LEAD(s.N1,1,1) OVER (ORDER BY s.N1) - 1),0)-s.N1,8000))  
   FROM cteStart s  
;  


0 commentaires

1
votes

La raison pour laquelle vous obtenez "JR" dans la troisième chaîne est un peu mystifié. C'est dans cette partie du code: xxx

Pourquoi utilisez-vous len (@NeString) pour le troisième paramètre de la sous-chaîne? Bien sûr, cela retournera le reste de la chaîne, y compris le "JR". Vous saviez clairement de ne pas le faire de cette façon lorsque vous obtenez la valeur @secondstring , comment pouvez-vous ne pas savoir de le faire de cette façon lors de l'obtention du @ThirdString ?

pour obtenir le @ThirdString Vous devez utiliser la même technique que vous avez utilisée pour obtenir le @secondstring .


2 commentaires

Oui monsieur, je sais que c'est là que c'est le problème, mais quand j'ai essayé d'appliquer la même logique que je l'ai fait dans le secondstring, cela ne sort pas correctement. Je reçois une partie du texte secondaire ou juste le format incorrect en général


Vous devez modifier votre question pour montrer votre tentative d'utiliser la même logique dans le tierstring, afin que nous puissions déboguer pourquoi cela n'a pas fonctionné pour vous. À propos, vous pouvez faciliter votre code à lire à l'aide des variables au lieu de répéter leurs calculs. En d'autres termes, au lieu de charindex ('', @ namestring, 1) +1 Vous pouvez simplement faire @ premierspaceloc + 1



1
votes

Ce script fera le travail

First String    Second String   Third String    Fourt String
Robert          Dobson          NULL            NULL


0 commentaires

1
votes

Est-ce que c'est ce que vous voulez? XXX PRE>

Retours: strong> p>

+--------+--------+------+------+
|  Str1  |  Str2  | Str3 | Str4 |
+--------+--------+------+------+
| Robert | Dobson | Bud  | jr   |
+--------+--------+------+------+


0 commentaires