Hi
This isn't exactly pretty ... but it's another way to skin the cat
;with cteOriginal (CompanyName, CompName1, CompName2, CompName3)
as
(
select 'A V H S L ALQUILER Y VENTA DE HOGARES', NULL, NULL, NULL union all
select 'TAXI GIL PIERRE', NULL, NULL, NULL union all
select 'DE GOUDSMID M HEIJKOOP', NULL, NULL, NULL union all
select 'S P S S', NULL, NULL, NULL union all
select 'BOUCHERIE CHARCUTERIE ST HENRI', NULL, NULL, NULL union all
select 'A A M RODERKERKEN', NULL, NULL, NULL union all
select 'O MUNDO E A NOSSA CASA - C H E', NULL, NULL, NULL)
-- Compress up the first single letters in the string
,preprocess as (
select CompanyName
,stuff(
CompanyName
,1
,isnull(nullif(patindex('% [a-z][a-z]%',substring(companyname,1,8)),0),isnull(nullif(charindex(' ',CompanyName,7),0),999))
,replace(substring(companyname,1,isnull(nullif(patindex('% [a-z][a-z]%',substring(companyname,1,8)),0),isnull(nullif(charindex(' ',CompanyName,7),0),999))),' ','') + ' '
) StuffedCompanyName
from cteOriginal
)
-- extract each company name in turn.
,r1 as (
select CompanyName
,rtrim(substring(StuffedCompanyName,1,isnull(nullif(charindex(' ',StuffedCompanyName),0),999))) Company1
,ltrim(substring(StuffedCompanyName,isnull(nullif(charindex(' ',StuffedCompanyName),0),999),999)) leftover
from preprocess
)
,r2 as (
select CompanyName
,Company1
,nullif(rtrim(substring(leftover,1,isnull(nullif(charindex(' ',leftover),0),999))),'') Company2
,ltrim(substring(leftover,isnull(nullif(charindex(' ',leftover),0),999),999)) leftover
from r1
)
,r3 as (
select CompanyName
,Company1
,Company2
,nullif(rtrim(substring(leftover,1,isnull(nullif(charindex(' ',leftover),0),999))),'') Company3
from r2
)
select * from r3
Micky