Select
Distinct
REPLACE(REPLACE(REPLACE(REPLACE(Category, ' & ', '-'), '/', '-'), ', ', '-'), ' ', '-') AS Department
From
Inv WITH(NOLOCK)
我很想知道因为我是一名小型ETL工程师,并希望养成良好的习惯。
显然,在许多情况下这可能会更长。
答案 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中这样做 - 在这种情况下,你可以在数据流中使用各种其他可能的方法,包括脚本任务和正则表达式。作为一般规则,您需要评估您正在执行的每个操作,并决定是否应该在将数据引入数据流或数据流本身的查询中完成。有些操作可以在源上做得更好(比如过滤),但是其他操作(比如聚合)可能在数据流中做得更好,特别是如果它们对任何类型的运行数据都有状态。