SQL-'08: Являются ли множественные операторы Replace плохой практикой / есть ли другой способ написать этот запрос? - PullRequest
7 голосов
/ 29 марта 2011
Select 
Distinct 
    REPLACE(REPLACE(REPLACE(REPLACE(Category, ' & ', '-'), '/', '-'), ', ', '-'), ' ', '-') AS Department 
From 
     Inv WITH(NOLOCK) 

Мне было интересно, потому что я младший инженер ETL и хочу развивать хорошие привычки.

Очевидно, что во многих обстоятельствах это может стать еще длиннее.

Ответы [ 2 ]

5 голосов
/ 30 марта 2011

Вложенная замена - это хорошо, но с увеличением уровня вложенности читаемость вашего кода снижается.Если бы у меня было большое количество символов для замены, я бы выбрал что-то более чистое, например, приведенный ниже табличный подход.

    declare @Category varchar(25)
    set @Category = 'ABC & DEF/GHI, LMN OP'
    -- nested replace
    select replace(replace(replace(replace(@Category, ' & ', '-'), '/', '-'), ', ', '-'), ' ', '-') as Department 

    -- table driven
    declare @t table (ReplaceThis varchar(10), WithThis varchar(10))
    insert into @t
        values  (' & ', '-'), 
                ('/', '-'),
                (', ', '-'),
                (' ', '-')

    select  @Category = replace(@Category, ReplaceThis, isnull(WithThis, ''))                       
    from    @t
    where   charindex(ReplaceThis, @Category) > 0;

    select @Category [Department]
3 голосов
/ 29 марта 2011

Возможно, вам лучше использовать SQLCLR и регулярное выражение. http://blogs.msdn.com/b/sqlclr/archive/2005/06/29/regex.aspx

Конечно, это может быть более удобным и гибким.

Что касается производительности, вам, как правило, трудно превзойти встроенные функции, но при многих операциях REPLACE CLR может превзойти ее - вам придется сравнивать.

Я заметил, что вы сказали, что делаете это в SSIS - в этом случае вы можете использовать множество других возможных методов в своих потоках данных, включая задачу сценария и регулярное выражение в них. Как правило, вам необходимо оценить каждую выполняемую вами операцию и решить, следует ли это делать в запросе, который переносит данные в потоки данных или в сам поток данных. Некоторые операции лучше выполнять (например, фильтрацию) в источнике, но другие (например, агрегирование) лучше выполнять в потоке данных, особенно если они находятся в состоянии с любыми видами выполняемых данных.

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