SQL Server 2012在特定的重复字符之前和之后删除字符串的一部分

时间:2015-11-30 02:00:26

标签: sql sql-server string tsql

请您协助解决令人困惑的字符串运算符问题? 我需要从表dbo.Log解析一个名为MachineName的NVARCHAR(32),而不是空列。格式为:

  • AA-BBB-CCC-DDD
  • AA-BBB-CCCC-DDD
  • AA-BBB-CCC-DDDD
  • AA-BBB-CCCC-DDDD

我需要结果集(作为[代码])为 CCC CCCC
我查阅了这篇文章: http://basitaalishan.com/2014/02/23/removing-part-of-string-before-and-after-specific-character-using-transact-sql-string-functions/

使用此代码:     SELECT DISTINCT [MachineName]     ,REPLACE(SUBSTRING([MachineName],CHARINDEX(' - ',[MachineName],6),LEN([MachineName])),' - ','')AS [代码]     来自[dbo]。[日志]

我当前的结果集在左侧很好,但右侧需要改进。

  • CCCDDD
  • CCCCDDDD

我会非常感谢你的帮助!提前谢谢

1 个答案:

答案 0 :(得分:0)

您可以即兴发挥:http://sqlfiddle.com/#!3/9eecb7d/588

with test as (
select cast('AA-BBB-CCC-DDD' as nvarchar(32)) as field1
union all
select cast('AA-BBB-CCCC-DDD' as nvarchar(32)) as field1
union all
select cast('AA-BBB-CCC-DDDD' as nvarchar(32)) as field1
union all
select cast('AA-BBB-CCCC-DDDD' as nvarchar(32)) as field1
)
select 
  substring(
    substring(field1,8,32), 
    1, 
    charindex('-', substring(field1,8,32))-1
  )
from test

结果:

CCC
CCCC
CCC
CCCC

使用子字符串,我们忽略前7个字符并从第8个字符开始。这会给我们CCCC-DDD等等。 charindex会告诉我们-CCCC-DDD等中的位置。我们在子串上重新应用子串;从第一个位置开始并全部捕获,直到找到-

在你的情况下,你可以这样做:

select distinct 
  substring(
    substring(MachineName,8,32), 
    1, 
    charindex('-', substring(MachineName,8,32))-1
  ) as Code
from dbo.Log