поиск и замена части строки для всех ячеек в столбце с использованием текста в ячейках для отдельной таблицы в качестве критерия поиска - PullRequest
1 голос
/ 05 июня 2019

Я использую Sql Server 2014

У меня есть две таблицы, и у каждой есть два столбца. У одного есть имена и адреса (имя таблицы - dbo.tgt_address), у другого - обычные аббревиатуры улиц и соответствующее сокращение, на которое я хочу изменить исходное сокращение (имя таблицы - dbo.street_abreviations).

enter image description here enter image description here

Мне нужен запрос, чтобы изменить текст в столбце Address таблицы tgt_address, где текст содержит текст из столбца обычно_используемой таблицы Street_abbreviation, на какой текст сокращен.

Выход:

enter image description here

Я понимаю, что это может работать для отдельных строк:

select replace(Address,'123 State St Chester PA 25374', '123 State ST Chester PA 25374')

но поскольку в таблице есть еще много записей, о которых я здесь сообщаю, как я могу создать более быстрый процесс? мне нужно было бы включить substring () и подвыбор в некотором роде? Я пытался найти документацию по этому вопросу, но не смог, поэтому я надеюсь, что кто-то может дать какое-то указание, чтобы хотя бы начать меня, спасибо!

1 Ответ

0 голосов
/ 05 июня 2019

Это скользкий спуск с адресами, но это может помочь, я верю:

Исходные данные:

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
;

Квартиры сложны, так как вокруг них нет места #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...