How can I retrieve first second and third word of a String in SQL?












-4















I need a query which would extract the first second and third word of a string.



I have approximately 5 words in each row and I need only the first three words out of 5 in the same row (1 row). Example "ATV BDSG 232 continue with other words".



I need only the first three words together in one row (in the same row) like "ATV BDSG 232" as a first row. The table has about 1000 rows and at the end of it I should have 1000 rows again but each row should contain only the first three words of the string.



I found a query which works fine for extracting first two like "ATV BDSG" discussed in stack overflow. The query is



"SELECT SUBSTRING(field1, 0, CHARINDEX(' ', field1, CHARINDEX(' ', field1, 0)+1))
FROM Table"



Can we derive this for extracting first three words?



Thanks in advance










share|improve this question

























  • Which version of SQL Server you are using?

    – Eray Balkanli
    Jan 3 at 16:03











  • Selam @ErayBalkanli. It is MSQL Server 2012

    – learningsql
    Jan 3 at 16:05











  • why question voted down 4 times? How about giving the questioner a reason?

    – Cato
    Jan 3 at 17:25
















-4















I need a query which would extract the first second and third word of a string.



I have approximately 5 words in each row and I need only the first three words out of 5 in the same row (1 row). Example "ATV BDSG 232 continue with other words".



I need only the first three words together in one row (in the same row) like "ATV BDSG 232" as a first row. The table has about 1000 rows and at the end of it I should have 1000 rows again but each row should contain only the first three words of the string.



I found a query which works fine for extracting first two like "ATV BDSG" discussed in stack overflow. The query is



"SELECT SUBSTRING(field1, 0, CHARINDEX(' ', field1, CHARINDEX(' ', field1, 0)+1))
FROM Table"



Can we derive this for extracting first three words?



Thanks in advance










share|improve this question

























  • Which version of SQL Server you are using?

    – Eray Balkanli
    Jan 3 at 16:03











  • Selam @ErayBalkanli. It is MSQL Server 2012

    – learningsql
    Jan 3 at 16:05











  • why question voted down 4 times? How about giving the questioner a reason?

    – Cato
    Jan 3 at 17:25














-4












-4








-4


1






I need a query which would extract the first second and third word of a string.



I have approximately 5 words in each row and I need only the first three words out of 5 in the same row (1 row). Example "ATV BDSG 232 continue with other words".



I need only the first three words together in one row (in the same row) like "ATV BDSG 232" as a first row. The table has about 1000 rows and at the end of it I should have 1000 rows again but each row should contain only the first three words of the string.



I found a query which works fine for extracting first two like "ATV BDSG" discussed in stack overflow. The query is



"SELECT SUBSTRING(field1, 0, CHARINDEX(' ', field1, CHARINDEX(' ', field1, 0)+1))
FROM Table"



Can we derive this for extracting first three words?



Thanks in advance










share|improve this question
















I need a query which would extract the first second and third word of a string.



I have approximately 5 words in each row and I need only the first three words out of 5 in the same row (1 row). Example "ATV BDSG 232 continue with other words".



I need only the first three words together in one row (in the same row) like "ATV BDSG 232" as a first row. The table has about 1000 rows and at the end of it I should have 1000 rows again but each row should contain only the first three words of the string.



I found a query which works fine for extracting first two like "ATV BDSG" discussed in stack overflow. The query is



"SELECT SUBSTRING(field1, 0, CHARINDEX(' ', field1, CHARINDEX(' ', field1, 0)+1))
FROM Table"



Can we derive this for extracting first three words?



Thanks in advance







sql sql-server ssms






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 3 at 20:20







learningsql

















asked Jan 3 at 16:01









learningsqllearningsql

34




34













  • Which version of SQL Server you are using?

    – Eray Balkanli
    Jan 3 at 16:03











  • Selam @ErayBalkanli. It is MSQL Server 2012

    – learningsql
    Jan 3 at 16:05











  • why question voted down 4 times? How about giving the questioner a reason?

    – Cato
    Jan 3 at 17:25



















  • Which version of SQL Server you are using?

    – Eray Balkanli
    Jan 3 at 16:03











  • Selam @ErayBalkanli. It is MSQL Server 2012

    – learningsql
    Jan 3 at 16:05











  • why question voted down 4 times? How about giving the questioner a reason?

    – Cato
    Jan 3 at 17:25

















Which version of SQL Server you are using?

– Eray Balkanli
Jan 3 at 16:03





Which version of SQL Server you are using?

– Eray Balkanli
Jan 3 at 16:03













Selam @ErayBalkanli. It is MSQL Server 2012

– learningsql
Jan 3 at 16:05





Selam @ErayBalkanli. It is MSQL Server 2012

– learningsql
Jan 3 at 16:05













why question voted down 4 times? How about giving the questioner a reason?

– Cato
Jan 3 at 17:25





why question voted down 4 times? How about giving the questioner a reason?

– Cato
Jan 3 at 17:25












3 Answers
3






active

oldest

votes


















1














If you don't want to create a dedicated function, you can use successive CROSS APPLYs:



SELECT
T.s,
FirstSpace.i,
SecondSpace.j,
ThirdSpace.k,
CASE
When ThirdSpace.k > 0 THEN LEFT(T.s, Thirdspace.k - 1)
ELSE T.S
END AS Phrase
FROM t
CROSS APPLY (SELECT CHARINDEX(' ', T.s, 1)) AS FirstSpace(i)
CROSS APPLY (SELECT CHARINDEX(' ', T.S, FirstSpace.i + 1)) AS SecondSpace(j)
CROSS APPLY (SELECT CHARINDEX(' ', T.s, SecondSpace.j + 1)) AS ThirdSpace(k)


gives you the results you need:



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





share|improve this answer


























  • I need only S table. I got this error "Invalid length parameter passed to the LEFT or SUBSTRING function." @zack

    – learningsql
    Jan 3 at 16:25













  • @learningsql: Do you have records that don't contain more than 3 words? That would produce the error. I'll update my answer to resolve that issue.

    – Zack
    Jan 3 at 16:29











  • All are greater than 3 words @zack

    – learningsql
    Jan 3 at 16:30













  • This works my case. Thank you! @zack

    – learningsql
    Jan 3 at 16:38





















0














Things are easy, SQL Server provide STRING_SPLIT() function make that too easy



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

SELECT Word
FROM
(
SELECT Value AS Word,
ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) RN
FROM STRING_SPLIT(@Var, ' ')
) T
WHERE RN <= 3;


But since you are working on 2012 version, you need to define your own function.



You can also take the hard way, first you need to get the first word, then replace it with '' and get the second word, then do the same for the 3rd word as



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

WITH FW AS
(
SELECT LEFT(@Var, CHARINDEX(' ', @Var)) FirstWord
),
SW AS
(
SELECT LEFT(REPLACE(@Var, FirstWord, ''),
CHARINDEX(' ', REPLACE(@Var, FirstWord, ''))) SecondWord
FROM FW
)
SELECT FirstWord,
SecondWord,
LEFT(REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''),
CHARINDEX(' ', REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''))
) ThirdWord
FROM
(
SELECT *, @Var V
FROM FW CROSS APPLY SW
) T


Demo



UPDATE



If you want to select the three first words then simply



SELECT SUBSTRING(Str, 0, CHARINDEX(' ', Str, CHARINDEX(' ', Str, CHARINDEX(' ', Str, 0)+1)+1)) Words
FROM Strings


Demo






share|improve this answer


























  • thank you for your time!

    – learningsql
    Jan 3 at 16:46



















0














 --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





share|improve this answer
























  • thank you very much for your time!

    – learningsql
    Jan 3 at 19:11












Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54025814%2fhow-can-i-retrieve-first-second-and-third-word-of-a-string-in-sql%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























3 Answers
3






active

oldest

votes








3 Answers
3






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














If you don't want to create a dedicated function, you can use successive CROSS APPLYs:



SELECT
T.s,
FirstSpace.i,
SecondSpace.j,
ThirdSpace.k,
CASE
When ThirdSpace.k > 0 THEN LEFT(T.s, Thirdspace.k - 1)
ELSE T.S
END AS Phrase
FROM t
CROSS APPLY (SELECT CHARINDEX(' ', T.s, 1)) AS FirstSpace(i)
CROSS APPLY (SELECT CHARINDEX(' ', T.S, FirstSpace.i + 1)) AS SecondSpace(j)
CROSS APPLY (SELECT CHARINDEX(' ', T.s, SecondSpace.j + 1)) AS ThirdSpace(k)


gives you the results you need:



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





share|improve this answer


























  • I need only S table. I got this error "Invalid length parameter passed to the LEFT or SUBSTRING function." @zack

    – learningsql
    Jan 3 at 16:25













  • @learningsql: Do you have records that don't contain more than 3 words? That would produce the error. I'll update my answer to resolve that issue.

    – Zack
    Jan 3 at 16:29











  • All are greater than 3 words @zack

    – learningsql
    Jan 3 at 16:30













  • This works my case. Thank you! @zack

    – learningsql
    Jan 3 at 16:38


















1














If you don't want to create a dedicated function, you can use successive CROSS APPLYs:



SELECT
T.s,
FirstSpace.i,
SecondSpace.j,
ThirdSpace.k,
CASE
When ThirdSpace.k > 0 THEN LEFT(T.s, Thirdspace.k - 1)
ELSE T.S
END AS Phrase
FROM t
CROSS APPLY (SELECT CHARINDEX(' ', T.s, 1)) AS FirstSpace(i)
CROSS APPLY (SELECT CHARINDEX(' ', T.S, FirstSpace.i + 1)) AS SecondSpace(j)
CROSS APPLY (SELECT CHARINDEX(' ', T.s, SecondSpace.j + 1)) AS ThirdSpace(k)


gives you the results you need:



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





share|improve this answer


























  • I need only S table. I got this error "Invalid length parameter passed to the LEFT or SUBSTRING function." @zack

    – learningsql
    Jan 3 at 16:25













  • @learningsql: Do you have records that don't contain more than 3 words? That would produce the error. I'll update my answer to resolve that issue.

    – Zack
    Jan 3 at 16:29











  • All are greater than 3 words @zack

    – learningsql
    Jan 3 at 16:30













  • This works my case. Thank you! @zack

    – learningsql
    Jan 3 at 16:38
















1












1








1







If you don't want to create a dedicated function, you can use successive CROSS APPLYs:



SELECT
T.s,
FirstSpace.i,
SecondSpace.j,
ThirdSpace.k,
CASE
When ThirdSpace.k > 0 THEN LEFT(T.s, Thirdspace.k - 1)
ELSE T.S
END AS Phrase
FROM t
CROSS APPLY (SELECT CHARINDEX(' ', T.s, 1)) AS FirstSpace(i)
CROSS APPLY (SELECT CHARINDEX(' ', T.S, FirstSpace.i + 1)) AS SecondSpace(j)
CROSS APPLY (SELECT CHARINDEX(' ', T.s, SecondSpace.j + 1)) AS ThirdSpace(k)


gives you the results you need:



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





share|improve this answer















If you don't want to create a dedicated function, you can use successive CROSS APPLYs:



SELECT
T.s,
FirstSpace.i,
SecondSpace.j,
ThirdSpace.k,
CASE
When ThirdSpace.k > 0 THEN LEFT(T.s, Thirdspace.k - 1)
ELSE T.S
END AS Phrase
FROM t
CROSS APPLY (SELECT CHARINDEX(' ', T.s, 1)) AS FirstSpace(i)
CROSS APPLY (SELECT CHARINDEX(' ', T.S, FirstSpace.i + 1)) AS SecondSpace(j)
CROSS APPLY (SELECT CHARINDEX(' ', T.s, SecondSpace.j + 1)) AS ThirdSpace(k)


gives you the results you need:



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






share|improve this answer














share|improve this answer



share|improve this answer








edited Jan 3 at 16:29

























answered Jan 3 at 16:20









ZackZack

1,5921212




1,5921212













  • I need only S table. I got this error "Invalid length parameter passed to the LEFT or SUBSTRING function." @zack

    – learningsql
    Jan 3 at 16:25













  • @learningsql: Do you have records that don't contain more than 3 words? That would produce the error. I'll update my answer to resolve that issue.

    – Zack
    Jan 3 at 16:29











  • All are greater than 3 words @zack

    – learningsql
    Jan 3 at 16:30













  • This works my case. Thank you! @zack

    – learningsql
    Jan 3 at 16:38





















  • I need only S table. I got this error "Invalid length parameter passed to the LEFT or SUBSTRING function." @zack

    – learningsql
    Jan 3 at 16:25













  • @learningsql: Do you have records that don't contain more than 3 words? That would produce the error. I'll update my answer to resolve that issue.

    – Zack
    Jan 3 at 16:29











  • All are greater than 3 words @zack

    – learningsql
    Jan 3 at 16:30













  • This works my case. Thank you! @zack

    – learningsql
    Jan 3 at 16:38



















I need only S table. I got this error "Invalid length parameter passed to the LEFT or SUBSTRING function." @zack

– learningsql
Jan 3 at 16:25







I need only S table. I got this error "Invalid length parameter passed to the LEFT or SUBSTRING function." @zack

– learningsql
Jan 3 at 16:25















@learningsql: Do you have records that don't contain more than 3 words? That would produce the error. I'll update my answer to resolve that issue.

– Zack
Jan 3 at 16:29





@learningsql: Do you have records that don't contain more than 3 words? That would produce the error. I'll update my answer to resolve that issue.

– Zack
Jan 3 at 16:29













All are greater than 3 words @zack

– learningsql
Jan 3 at 16:30







All are greater than 3 words @zack

– learningsql
Jan 3 at 16:30















This works my case. Thank you! @zack

– learningsql
Jan 3 at 16:38







This works my case. Thank you! @zack

– learningsql
Jan 3 at 16:38















0














Things are easy, SQL Server provide STRING_SPLIT() function make that too easy



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

SELECT Word
FROM
(
SELECT Value AS Word,
ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) RN
FROM STRING_SPLIT(@Var, ' ')
) T
WHERE RN <= 3;


But since you are working on 2012 version, you need to define your own function.



You can also take the hard way, first you need to get the first word, then replace it with '' and get the second word, then do the same for the 3rd word as



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

WITH FW AS
(
SELECT LEFT(@Var, CHARINDEX(' ', @Var)) FirstWord
),
SW AS
(
SELECT LEFT(REPLACE(@Var, FirstWord, ''),
CHARINDEX(' ', REPLACE(@Var, FirstWord, ''))) SecondWord
FROM FW
)
SELECT FirstWord,
SecondWord,
LEFT(REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''),
CHARINDEX(' ', REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''))
) ThirdWord
FROM
(
SELECT *, @Var V
FROM FW CROSS APPLY SW
) T


Demo



UPDATE



If you want to select the three first words then simply



SELECT SUBSTRING(Str, 0, CHARINDEX(' ', Str, CHARINDEX(' ', Str, CHARINDEX(' ', Str, 0)+1)+1)) Words
FROM Strings


Demo






share|improve this answer


























  • thank you for your time!

    – learningsql
    Jan 3 at 16:46
















0














Things are easy, SQL Server provide STRING_SPLIT() function make that too easy



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

SELECT Word
FROM
(
SELECT Value AS Word,
ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) RN
FROM STRING_SPLIT(@Var, ' ')
) T
WHERE RN <= 3;


But since you are working on 2012 version, you need to define your own function.



You can also take the hard way, first you need to get the first word, then replace it with '' and get the second word, then do the same for the 3rd word as



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

WITH FW AS
(
SELECT LEFT(@Var, CHARINDEX(' ', @Var)) FirstWord
),
SW AS
(
SELECT LEFT(REPLACE(@Var, FirstWord, ''),
CHARINDEX(' ', REPLACE(@Var, FirstWord, ''))) SecondWord
FROM FW
)
SELECT FirstWord,
SecondWord,
LEFT(REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''),
CHARINDEX(' ', REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''))
) ThirdWord
FROM
(
SELECT *, @Var V
FROM FW CROSS APPLY SW
) T


Demo



UPDATE



If you want to select the three first words then simply



SELECT SUBSTRING(Str, 0, CHARINDEX(' ', Str, CHARINDEX(' ', Str, CHARINDEX(' ', Str, 0)+1)+1)) Words
FROM Strings


Demo






share|improve this answer


























  • thank you for your time!

    – learningsql
    Jan 3 at 16:46














0












0








0







Things are easy, SQL Server provide STRING_SPLIT() function make that too easy



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

SELECT Word
FROM
(
SELECT Value AS Word,
ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) RN
FROM STRING_SPLIT(@Var, ' ')
) T
WHERE RN <= 3;


But since you are working on 2012 version, you need to define your own function.



You can also take the hard way, first you need to get the first word, then replace it with '' and get the second word, then do the same for the 3rd word as



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

WITH FW AS
(
SELECT LEFT(@Var, CHARINDEX(' ', @Var)) FirstWord
),
SW AS
(
SELECT LEFT(REPLACE(@Var, FirstWord, ''),
CHARINDEX(' ', REPLACE(@Var, FirstWord, ''))) SecondWord
FROM FW
)
SELECT FirstWord,
SecondWord,
LEFT(REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''),
CHARINDEX(' ', REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''))
) ThirdWord
FROM
(
SELECT *, @Var V
FROM FW CROSS APPLY SW
) T


Demo



UPDATE



If you want to select the three first words then simply



SELECT SUBSTRING(Str, 0, CHARINDEX(' ', Str, CHARINDEX(' ', Str, CHARINDEX(' ', Str, 0)+1)+1)) Words
FROM Strings


Demo






share|improve this answer















Things are easy, SQL Server provide STRING_SPLIT() function make that too easy



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

SELECT Word
FROM
(
SELECT Value AS Word,
ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) RN
FROM STRING_SPLIT(@Var, ' ')
) T
WHERE RN <= 3;


But since you are working on 2012 version, you need to define your own function.



You can also take the hard way, first you need to get the first word, then replace it with '' and get the second word, then do the same for the 3rd word as



DECLARE @Var VARCHAR(100) = 'ATV BDSG 232 Continue with other words';

WITH FW AS
(
SELECT LEFT(@Var, CHARINDEX(' ', @Var)) FirstWord
),
SW AS
(
SELECT LEFT(REPLACE(@Var, FirstWord, ''),
CHARINDEX(' ', REPLACE(@Var, FirstWord, ''))) SecondWord
FROM FW
)
SELECT FirstWord,
SecondWord,
LEFT(REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''),
CHARINDEX(' ', REPLACE(REPLACE(V, FirstWord, ''), SecondWord, ''))
) ThirdWord
FROM
(
SELECT *, @Var V
FROM FW CROSS APPLY SW
) T


Demo



UPDATE



If you want to select the three first words then simply



SELECT SUBSTRING(Str, 0, CHARINDEX(' ', Str, CHARINDEX(' ', Str, CHARINDEX(' ', Str, 0)+1)+1)) Words
FROM Strings


Demo







share|improve this answer














share|improve this answer



share|improve this answer








edited Jan 3 at 17:14

























answered Jan 3 at 16:16









SamiSami

9,29331244




9,29331244













  • thank you for your time!

    – learningsql
    Jan 3 at 16:46



















  • thank you for your time!

    – learningsql
    Jan 3 at 16:46

















thank you for your time!

– learningsql
Jan 3 at 16:46





thank you for your time!

– learningsql
Jan 3 at 16:46











0














 --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





share|improve this answer
























  • thank you very much for your time!

    – learningsql
    Jan 3 at 19:11
















0














 --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





share|improve this answer
























  • thank you very much for your time!

    – learningsql
    Jan 3 at 19:11














0












0








0







 --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





share|improve this answer













 --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






share|improve this answer












share|improve this answer



share|improve this answer










answered Jan 3 at 17:23









CatoCato

2,975212




2,975212













  • thank you very much for your time!

    – learningsql
    Jan 3 at 19:11



















  • thank you very much for your time!

    – learningsql
    Jan 3 at 19:11

















thank you very much for your time!

– learningsql
Jan 3 at 19:11





thank you very much for your time!

– learningsql
Jan 3 at 19:11


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54025814%2fhow-can-i-retrieve-first-second-and-third-word-of-a-string-in-sql%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Monofisismo

Angular Downloading a file using contenturl with Basic Authentication

Olmecas