Hi @SQL9 ,
Thanks for your update.
If you could list all cityname with "City", "Ville" or anything, you could refer below:
;with cte as (
select ROW_NUMBER() Over (order by (select null)) addressid,FullAddress from @Address)
,cte1 as (
SELECT ROW_NUMBER() Over (partition by addressid order by (select null) ) id, value,addressid FROM cte
cross apply STRING_SPLIT(FullAddress, SPACE(1)))
,cte2 as (
select ROW_NUMBER() Over (partition by addressid order by id desc) rn ,value ,addressid
from cte1)
,cte3 as (
select a.*,b.value1
from cte2 a
left join (select addressid,value value1 from cte2 where rn=3) b on a.addressid=b.addressid)
select STRING_AGG(value,SPACE(1)) WITHIN GROUP (ORDER BY rn DESC) Result
from cte3
where value1 in ('city','Ville') and rn<=4
group by addressid
union
select STRING_AGG(value,SPACE(1)) WITHIN GROUP (ORDER BY rn DESC) Result
from cte3
where value1 not in ('city','Ville') and rn<4
group by addressid
Output:
Result
ADDISON VA 24293
BLOOMINGDALE IL 60108
CHICAGO IL 60625
EDISON NJ 34561
MASON CITY IL 626641104
PLAIN CITY OH 60053
Or you could refer another method using user-defined function.
Firstly create one function as below:
CREATE FUNCTION dbo.GetSplitString
(
@List VARCHAR(MAX),
@Delimiter VARCHAR(255),
@ElementNumber int
)
RETURNS VARCHAR(4000)
AS
BEGIN
DECLARE @result varchar(4000)
DECLARE @Items TABLE ( position int IDENTITY PRIMARY KEY,
Item VARCHAR(4000)
)
DECLARE @ll INT = LEN(@List) + 1, @ld INT = LEN(@Delimiter);
WITH a AS
(
SELECT
[start] = 1,
[end] = COALESCE(NULLIF(CHARINDEX(@Delimiter,
@List, @ld), 0), @ll),
[value] = SUBSTRING(@List, 1,
COALESCE(NULLIF(CHARINDEX(@Delimiter,
@List, @ld), 0), @ll) - 1)
UNION ALL
SELECT
[start] = CONVERT(INT, [end]) + @ld,
[end] = COALESCE(NULLIF(CHARINDEX(@Delimiter,
@List, [end] + @ld), 0), @ll),
[value] = SUBSTRING(@List, [end] + @ld,
COALESCE(NULLIF(CHARINDEX(@Delimiter,
@List, [end] + @ld), 0), @ll)-[end]-@ld)
FROM a
WHERE [end] < @ll
)
INSERT @Items SELECT [value]
FROM a
WHERE LEN([value]) > 0
OPTION (MAXRECURSION 0);
SELECT @result=Item
FROM @Items
WHERE position=@ElementNumber
RETURN @result;
END
GO
Then call this function as below:
SELECT case when REVERSE(dbo.GetSplitString(REVERSE(replace(FullAddress,' ',',')),',',3)) in ('city','Ville')
then right(FullAddress,charindex(' ', REVERSE(FullAddress),charindex(' ', REVERSE(FullAddress),charindex(' ', REVERSE(FullAddress), (charindex(' ', REVERSE(FullAddress), 1))+1)+1)+1))
else right(FullAddress,charindex(' ', REVERSE(FullAddress),charindex(' ', REVERSE(FullAddress), (charindex(' ', REVERSE(FullAddress), 1))+1)+1))
end result
from @Address
Best regards,
Melissa
If the answer is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.