减少SQL代码中的冗余/重复

Mat*_*lie 5 sql sql-server coding-style

在stackoverflow的这个问题中,接受的答案涉及多次重复相同的代码片段.根据我的经验,许多人努力通过各种方式以各种方式封装代码片段来减少这种情况;
- 可维护性(更改的地方更少)
- 可读性(一次读取代码,然后每次都是"别名")
- 等等

使用链接问题中的代码,您将如何开始减少相同代码片段的重复?或者你会原样离开吗?

(不使用替代逻辑,但坚持使用REPLACE等,只是改变相同逻辑的现状.)

Select  Case
        When CharIndex('.', Replace(URL, 'www.','')) > 0 then
           Left(Replace(URL, 'www.',''), CharIndex('.',Replace(URL, 'www.',''))-1)
        Else
           Replace(URL, 'www.','')
        End as [CleanURL]
From dbo.YourTable 
Run Code Online (Sandbox Code Playgroud)

(接受的答案已更改,因此我将代码示例复制到此处.)

编辑

只是为了澄清,我认为我已经引起了混乱.

这不是:
- 如何封装这整段代码以便重复使用?

但它更确切地说:
- 如何减少这段代码中的冗余?

Mik*_*son 6

;with cte as
(
  select replace(URL, 'www.', '')+'.' as url
  from myTable
)
select
  left(url, charindex('.', url)-1)
from cte
Run Code Online (Sandbox Code Playgroud)

编辑 1您可以使用执行重复代码的嵌套选择。与使用 cte 并没有什么不同。

Select  Case
        When CharIndex('.', URL) > 0 then
           Left(URL, CharIndex('.',URL)-1)
        Else
           URL
        End as [CleanURL]
From 
  (select Replace(URL, 'www.','') as URL
   from myTable) as T
Run Code Online (Sandbox Code Playgroud)

Edit2删除了重复的 charindex。使用交叉应用

select
  case
    when c2.idx > 0 then
      left(c1.url, c2.idx)
    else
      c1.url
  end
from myTable as m
  cross apply (select replace(m.URL, 'www.', '')) as c1(url)
  cross apply (select charindex('.', c1.url)) as c2(idx)
Run Code Online (Sandbox Code Playgroud)

  • 其实我的意思是说它更易读但也更难理解。 (2认同)