SQL-'08:多个Replace语句是不好的做法/是否有其他方法来编写此查询?

时间:2011-03-29 15:59:39

标签: sql sql-server-2008 ssis replace

Select 
Distinct 
    REPLACE(REPLACE(REPLACE(REPLACE(Category, ' & ', '-'), '/', '-'), ', ', '-'), ' ', '-') AS Department 
From 
     Inv WITH(NOLOCK) 

我很想知道因为我是一名小型ETL工程师,并希望养成良好的习惯。

显然,在许多情况下这可能会更长。

2 个答案:

答案 0 :(得分:5)

嵌套替换很好,但随着嵌套级别的增加,代码的可读性会下降。如果我要替换大量的字符,我会选择像下表驱动方法那样更干净的东西。

    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]

答案 1 :(得分:3)

使用SQLCLR和正则表达式可能会更好。 http://blogs.msdn.com/b/sqlclr/archive/2005/06/29/regex.aspx

当然,这可以更加可维护和灵活。

就性能而言,您通常会发现很难击败内置函数,但是对于许多REPLACE操作,CLR可能会超越它 - 您必须进行基准测试。

我注意到你说你在SSIS中这样做 - 在这种情况下,你可以在数据流中使用各种其他可能的方法,包括脚本任务和正则表达式。作为一般规则,您需要评估您正在执行的每个操作,并决定是否应该在将数据引入数据流或数据流本身的查询中完成。有些操作可以在源上做得更好(比如过滤),但是其他操作(比如聚合)可能在数据流中做得更好,特别是如果它们对任何类型的运行数据都有状态。