回答

2

我已經發布了一個遞歸解決方案首先這是更快:

declare @name varchar(20) = 'Jon Kirk' 

declare @loop int = len(@name) 

while @loop > 1 
select @name = stuff(@name, @loop, 1, 
case when substring(@name, @loop-1,2) like '% ' then ' ' 
    when substring(@name, @loop-1,2) like ' %' then substring(@name, @loop,1) 
else '*' end), @loop+=-1 

select @name 
+0

這兩種解決方案都能正常工作。我非常感謝你的幫助。 – user3382673

+0

找到更快速的解決方案。看到我更新的答案 – GriGrim

0

如何像這樣

declare @s varchar(50) = 'Jon kirk' 

;with cte as (
    select 1 as i, cast (' ' + ltrim (@s) as varchar(50)) as s 
    union all 
    select i + 1 
     , cast (
      case when substring (s, i, 2) like '% %' 
      then s 
      else stuff (s, i + 1, 1, '*') end 
     as varchar(50)) 
    from cte 
    where i < len (s) 
) 

select top 1 ltrim (s) as s 
from cte 
order by i desc 

這裏是最快的解決方案(雖然不是很漂亮嗎?在所有):

declare @s varchar(50) = 'Jon kirk' 

select left (
     left (@s, 1) 
    + case when substring (@s, 1, 2) like '% %' then substring (@s, 2, 1) else '*' end 
    + case when substring (@s, 2, 2) like '% %' then substring (@s, 3, 1) else '*' end 
    + ... 
    + case when substring (@s, 48, 2) like '% %' then substring (@s, 49, 1) else '*' end 
    + case when substring (@s, 49, 2) like '% %' then substring (@s, 50, 1) else '*' end 
    , len (@s)) 
+0

如果第一個字母是小寫,那麼怎麼辦? –

+0

查看更新的答案 – GriGrim

+0

我首先嚐試使用遞歸,使用簡單的while循環更有效。在從修改列表中選擇結果之前,您將所有結果存儲在內存中。 –

相關問題