J'ai besoin d'une requête qui extraire le premier deuxième et troisième mot d'une chaîne. P>
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". p>
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. p>
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 p>
Peut-on dériver cela pour extraire les trois premiers mots? p>
Merci d'avance p>
5 Réponses :
Les choses sont faciles, SQL Server fournit Mais puisque vous travaillez sur la version 2012, vous devez définir votre propre fonction. P> Vous pouvez également prendre la difficulté difficile, vous devez d'abord obtenir le premier mot, puis le remplacer par mise à jour em> p> Si vous souhaitez sélectionner les trois premiers mots, alors simplement p> string_split () code> Fonction Faites que trop facile
'' code> et obtenir le deuxième mot, puis faire de même Pour le 3ème mot comme p>
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 |
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
--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
/* 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
Pour sélectionner le premier mot - pour sélectionner seulement un second mot - p>
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?