I want to get the string between two characters in the following string:
hello @user1, how are you?
I want to get the text between the @ and the SPACE after the @ which results in user1, is there a way to do this? There could even be 2 or more @ which I will need to extract like
hello @user1 ,@user2 ,@... , how are you?
here is a table-like example:
| Sample | Excpected Output |
|---|---|
| Hello @user1 and @user2 how are you? | user1, user2 |
| @user1 and @user2 replied | user1, user2 |
but there will always be a SPACE after each @.
Thanks for the help.
Advertisement
Answer
The usual way to approach would be a combination of String_Split() and String_Agg():
with sampledata as ( select 'Hello @user1 and @user2 how are you?' sample union all select '@user1 and @user2 replied' ) select sample, String_Agg(Replace([value], '@',''), ', ') Result from sampledata cross apply String_Split(sample,' ') where [value] like '@%' group by sample;
See Working fiddle
As requested, a possible alternative approach to ensure the ordering of the string elements is as follows; this method uses a json array that provides the array index for ordering:
select sample,
String_Agg(Replace([value], '@',''), ', ') within group(order by seq) Result
from sampledata
cross apply (
select j.[value], 1 + Convert(tinyint, j.[key]) Seq
from OpenJson(Concat('["', replace(sample, ' ', '","'), '"]')) j
)s
where [value] like '@%'
group by sample;
Note from this alternative Fiddle you can reverse the ordering or the strings using the desc keyword.