Это скользкий спуск с адресами, но это может помочь, я верю:
Исходные данные:
DECLARE @tgt_address TABLE (ID INT IDENTITY(1,1),Name NVARCHAR(255),Address NVARCHAR(255));
INSERT INTO @tgt_address(Name,Address)VALUES
('John','123 State St Chester PA 25374')
,('Steve','798 Main Avn New York NY 21314')
,('Martha','981 West Ln Wilmington De 23142')
,('Mary','124 Main Street #2 Austin Tx 21432')
,('Timothy','25 Lark Thwy Maiami FL 12342')
;
DECLARE @Street_abbreviation TABLE (Commonly_used NVARCHAR(255),Abbreviation NVARCHAR(255));
INSERT INTO @Street_abbreviation(Commonly_used,Abbreviation)VALUES
('St','ST')
,('Avn','AVE')
,('Ln','LN')
,('#','APT')
,('Thwy','THROUGHWAY')
;
Не самый лучший, но легкийкод:
SELECT t.Name,t.Address
,REPLACE(REPLACE(t.Address,'#','# '),' ' + a.Commonly_used + ' ',' ' + a.Abbreviation + ' ') AS [Result]
FROM @tgt_address t
INNER JOIN @Street_abbreviation a ON REPLACE(t.Address,'#','# ') LIKE '%[ ]' + a.Commonly_used + '[ ]%'
;
умнее код:
SELECT r.Name,r.Address,r.Result
FROM (
SELECT t.Name,t.Address
,REPLACE(REPLACE(t.Address,'#','# '),' ' + a.Commonly_used + ' ',' ' + a.Abbreviation + ' ') AS [Result]
,ROW_NUMBER()OVER(PARTITION BY t.Name,t.Address
ORDER BY CASE WHEN REPLACE(t.Address,'#','# ') LIKE '%[ ]' + a.Commonly_used + '[ ]%' THEN 0 ELSE 1 END) AS [rn]
FROM @tgt_address t
CROSS JOIN @Street_abbreviation a
) r
WHERE r.rn = 1
;
Квартиры сложны, так как вокруг них нет места #