任何人都知道如何使用SQL并替换连字符和掩码

时间:2018-08-17 13:34:05

标签: sql-server tsql sql-server-2014

我必须更新很多数据。我有以下问题。

在数据库中,有一个[名称]字段,其中包含他们想做的各种格式的名称,如果有一个字符,后跟一个-然后另一个字符将这些字符折叠在一起

A-K Consulting LLC-> AK Consulting LLC
4-T fish鱼-> 4T fish鱼
但是L-Tech LLC将保持不变。

我尝试使用
replace(name,'%-%',char(10))
,但是在字段中留下了退格字符,不是理想的结果。

从未尝试过尝试删除连字符,然后仅将其折叠在列中间。任何人都有任何想法。

2 个答案:

答案 0 :(得分:2)

这是一种解析名称,然后根据_-_模式进行条件聚集的方法

完全公开:在大桌子上可能效果不佳。

示例

Declare @YourTable Table ([Name] varchar(50))
Insert Into @YourTable Values 
 ('A-K Consulting LLC')
,('4-T Catfish')
,('L-Tech LLC')

Select A.Name
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select S = Stuff((Select ' ' +case when RetVal like '_-_' then replace(RetVal,'-','') else RetVal end
                  From (
                        Select RetSeq = Row_Number() over (Order By (Select null))
                              ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace((Select replace(A.Name,' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                       ) B1
                  Order by RetSeq
                  For XML Path ('')),1,1,'') 
             ) B

返回

Name                  S
A-K Consulting LLC    AK Consulting LLC
4-T Catfish           4T Catfish
L-Tech LLC            L-Tech LLC
  

编辑-如果仅发生1次---忘记了ltrim / rtrim

Select A.Name
      ,S =  case when patindex('% _-_ %',' '+Name+' ')>0 
            then ltrim(rtrim(stuff(Name,patindex('% _-_ %',' '+Name+' ')+1,1,'')))
            else Name
            end
 From  @YourTable A
  

EDIT2-基于Jeroen的见识

Select A.Name
      ,S = ISNULL(STUFF([Name], NULLIF(PATINDEX('% _-_ %', ' ' + [Name] + ' '), 0) + 1, 1, ''), [Name])
 From  @YourTable A

答案 1 :(得分:0)

尝试一下:

SELECT [Name],REPLACE([Name],'-',char(10)) FROM Table1;