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?