-4
votes

Comment puis-je récupérer la première deuxième et troisième mot d'une chaîne dans SQL?

J'ai besoin d'une requête qui extraire le premier deuxième et troisième mot d'une chaîne.

J'ai environ 5 mots dans chaque rangée et j'ai besoin que des trois premiers mots sur 5 de la même rangée (1 rangée). Exemple "ATV BDSG 232 Continuer avec d'autres mots".

J'ai besoin que des trois premiers mots ensemble d'une rangée (dans la même ligne) comme "ATV BDSG 232" comme première rangée. La table a environ 1000 rangées et à la fin de celui-ci, je devrais avoir 1000 rangées, mais chaque ligne ne doit contenir que les trois premiers mots de la chaîne.

J'ai trouvé une requête qui fonctionne bien pour extraire les deux premiers comme "VTT BDSG" discuté dans le débordement de la pile. La requête est

"Sélectionnez la sous-chaîne (champ1, 0, Charindex ('', Field1, Charindex ('', Field1, 0) +1)) De la table "

Peut-on dériver cela pour extraire les trois premiers mots?

Merci d'avance


3 commentaires

Quelle version de SQL Server vous utilisez?


Selam @eraybalkanli. C'est SQL Server 2012


Pourquoi la question a-t-elle voté 4 fois? Que diriez-vous de donner à l'intervenant une raison?


5 Réponses :


1
votes

Les choses sont faciles, SQL Server fournit string_split () Fonction Faites que trop facile xxx

Mais puisque vous travaillez sur la version 2012, vous devez définir votre propre fonction.

Vous pouvez également prendre la difficulté difficile, vous devez d'abord obtenir le premier mot, puis le remplacer par '' et obtenir le deuxième mot, puis faire de même Pour le 3ème mot comme xxx

Démo

mise à jour

Si vous souhaitez sélectionner les trois premiers mots, alors simplement xxx

démo


0 commentaires

2
votes

Si vous ne voulez pas créer de fonction dédiée, vous pouvez utiliser Successive Cross Appliquer Code> S:

|                   s                    | i | j | k  | phrase           |
|----------------------------------------|---|---|----|------------------|
| ATV BDSG 232 Continue with other words | 4 | 9 | 13 | ATV BDSG 232     |


3 commentaires

J'ai besoin que de la table S. J'ai cette erreur "Paramètre de longueur non valide transmis à la fonction de gauche ou de sous-chaîne." @zack


@learningsQL: Avez-vous des enregistrements qui ne contiennent pas plus de 3 mots? Cela produirait l'erreur. Je vais mettre à jour ma réponse pour résoudre ce problème.


Tous sont supérieurs à 3 mots @zack



0
votes
 --make some test data

declare @test as nvarchar(100) = 'my test   string  for words';

select 1 id, cast('my test   string  for words' as nvarchar(max)) word into #test;
insert #test (id,word) values (2,'a  b c d e f g hhh   yyyyyy') ;
insert #test (id,word) values (3,'  a required test string  d e f g hhh   yyyyyy') ;
insert #test (id,word) values (4,'a quick test') ;
insert #test (id,word) values (5,'a test') ;
insert #test (id,word) values (6,'last') ;

--break up letters, count the first 3 words
;WITH CTE AS (SELECT 1 x, substring(@test,1,1) charx
             UNION ALL
             SELECT X + 1, substring(@test,x + 1,1) from CTE WHERE x < len(@test) 
             )
             select * from cte c3 where (SELECT count(0) cnt FROM CTE c1 JOIN CTE c2 on c1.x <= c3.x and c1.x + 1 = c2.x and c1.charx =' ' and c2.charx != ' ') < 3



;WITH   tabx as (select id, cast(ltrim(word) as nvarchar(max)) 'word' from #test),    --do some ltrim
        CTE AS (
                SELECT id, 1 x, substring(word,1,1) charx from tabx
                UNION ALL
                SELECT t.id, c.X + 1, substring(t.word,x + 1,1)  
                        from tabx t 
                            JOIN CTE c on c.id =  t.id and x < len(t.word) 
             ),
        disj as
             (select * from cte c3 where 
                        (SELECT count(0) cnt 
                                FROM CTE c1 
                                JOIN CTE c2 on c1.id = c3.id and c1.id = c2.id and c1.x <= c3.x and c1.x + 1 = c2.x and c1.charx =' ' and c2.charx != ' '
                        ) < 3
                ),
        rj as 
            (select disj.id,disj.x, disj.charx z  
                                from disj 
                                where disj.x = 1 
                UNION ALL 
                    select d.id, d.x, r.z + d.charx    
                            FROM rj r 
                            join disj d on r.id = d.id and r.x + 1 = d.x
            )
                select *  
                    from rj r1  
                        cross apply (select max(r2.x) TheRow from rj r2 where r1.id = r2.id) dq
                    where r1.x = dq.TheRow  
                    order by r1.id;

 --delete test data
drop table #test 

0 commentaires

0
votes
/* This is not perfect - but interesting */
declare @t table (fullname varchar(100))
insert @t values('Mr Jones'),('Mrs Amy smith'),('Jim Smith'),('Dr Harry Web '),('Paul Fred andrew jones')

select fullname,

a.value as a ,
b.Value as b,
c.Value as c,
d.Value as d,
e.Value as e,
f.value as f

from @t
outer apply (select top 1 value from STRING_SPLIT(fullname, ' '))  a 
outer apply (select top 1 value from STRING_SPLIT(fullname, ' ')   where value not in (a.value ))  b
outer apply (select top 1 value from STRING_SPLIT(fullname, ' ')   where value not in (a.value,b.value ) ) c
outer apply (select top 1 value from STRING_SPLIT(fullname, ' ')   where value not in (a.value,b.value,c.value ))  d
outer apply (select top 1 value from STRING_SPLIT(fullname, ' ')   where value not in (a.value,b.value,c.value,d.value) ) e
outer apply (select top 1 value from STRING_SPLIT(fullname, ' ')   where value not in (a.value,b.value ,c.value,d.value,e.value) ) f

0 commentaires

0
votes

Pour sélectionner le premier mot - xxx

pour sélectionner seulement un second mot - xxx


0 commentaires