Как удалять буквы только тогда, когда они образуют слово (например, Co и Co), а не тогда, когда они являются частью слова (Co-nstruction) - PullRequest
1 голос
/ 31 мая 2019

Я должен очистить столбец с названиями компаний, удалив Inc, Ltd, & Co, Co, Corp,., $, &, и т. д., и список может быть обновлен позже.

В Sql server 2016 я использовал Replace, но он будет заменять везде эти буквы не только тогда, когда они образуют определенное слово, например, имя Co.

alter table [CompanyList] add CleanLegalName as 
    cast (Rtrim( Replace (Replace (Replace (Replace (Replace (Replace (Replace (Replace (REPLACE
        ([Legal Name], ' INC', ''), '.', ''), ' LTD', ''), ' Inc', ''), ' Ltd', ''), ' LIMITED', ''), ' INCOPORATED' ,'') , ',' , '') , ' CO', '')
      ) as varchar(200))

Проблема в том, что Replace заменяет вездеэти буквы, такие как: «Jane Construction» с «Jane nstruction», «Inca Food» с «a Food».Как я могу удалить эти буквы только тогда, когда они образуют слово самостоятельно, а не как часть другого слова?Спасибо

1 Ответ

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

Допустим, у нас есть следующий сценарий

    CREATE TABLE #Temp([Legal Name] NVARCHAR(MAX))

    INSERT INTO #Temp ([Legal Name]) VALUES ('Beer Acme Co.')
    INSERT INTO #Temp ([Legal Name]) VALUES ('Company of Brothers Co')
    INSERT INTO #Temp ([Legal Name]) VALUES ('My Star Inc.')
    INSERT INTO #Temp ([Legal Name]) VALUES ('Incredible Monsters INC')
    INSERT INTO #Temp ([Legal Name]) VALUES ('Limit Is The Sky Ltd')
    INSERT INTO #Temp ([Legal Name]) VALUES ('Limit Is The Universe Ltd.')
    INSERT INTO #Temp ([Legal Name]) VALUES ('Unlimited Minds Limited.')
    INSERT INTO #Temp ([Legal Name]) VALUES ('Unlimited Borders Limited')

Я могу предложить два способа попробовать вам помочь.

Вариант 1

Через скалярную функцию

    CREATE FUNCTION [dbo].[GetClearedName](@VALUE NVARCHAR(MAX))
    RETURNS NVARCHAR(MAX)
    AS
        BEGIN

            DECLARE @PATTERN NVARCHAR(MAX)
            DECLARE @TEMP TABLE ([PATTERN] NVARCHAR(MAX))

            INSERT INTO @TEMP ([PATTERN]) VALUES ('%Co.')
            INSERT INTO @TEMP ([PATTERN]) VALUES ('% Co%')      
            INSERT INTO @TEMP ([PATTERN]) VALUES ('%Inc.')
            INSERT INTO @TEMP ([PATTERN]) VALUES ('% Inc')
            INSERT INTO @TEMP ([PATTERN]) VALUES ('% Ltd')
            INSERT INTO @TEMP ([PATTERN]) VALUES ('%Ltd.')
            INSERT INTO @TEMP ([PATTERN]) VALUES ('%Limited.')
            INSERT INTO @TEMP ([PATTERN]) VALUES ('% Limited')

            DECLARE @RESULT NVARCHAR(MAX)

            SET @RESULT = @VALUE

            DECLARE PATTERN_CURSOR CURSOR FOR SELECT [PATTERN] FROM @TEMP

            OPEN PATTERN_CURSOR
            FETCH NEXT FROM PATTERN_CURSOR INTO @PATTERN

            WHILE (@@FETCH_STATUS = 0)
                BEGIN


                    IF (PATINDEX(@PATTERN, @RESULT) > 0)
                        BEGIN
                            SET @RESULT = SUBSTRING(@RESULT, 0, PATINDEX(@PATTERN, @RESULT))                
                        END

                    FETCH NEXT FROM PATTERN_CURSOR INTO @PATTERN
                END

            CLOSE PATTERN_CURSOR
            DEALLOCATE PATTERN_CURSOR

            IF (LEN(@RESULT) <> 0)
                RETURN @RESULT 

            Return @VALUE
        END

Вы можете использовать функцию следующим образом:

    SELECT [dbo].[GetClearedName]([Legal Name]) FROM #Temp

    DROP TABLE #Temp

Опция 2

Используя # SQL , также это можно преобразовать вфункция.

    SELECT [Legal Name],
        SQL#.RegEx_Replace4k(
            SQL#.RegEx_Replace4k(
                SQL#.RegEx_Replace4k( 
                    SQL#.RegEx_Replace4k([Legal Name], N'(CO+\.|\sCO$)', N' ', -1, 1, 'IgnoreCase'), 
                                                            N'(INC+\.|\sINC$)', N' ', -1, 1, 'IgnoreCase'), 
                                                                    N'(LTD+\.|\sLTD$)', N' ', -1, 1, 'IgnoreCase'),
                                                                        N'(Limited+\.|\sLimited$)', N' ', -1, 1, 'IgnoreCase')
        As [Cleared Name] 
    FROM 
        #Temp

    DROP TABLE #Temp

Ожидаемые результаты

expected results

...