如何用SQL重新排列字符串?

Declare @CustTotalCount as int Declare @CustMatchCount as int select @CustTotalCount = count(*) from ENG_CUSTOMERTALLY select @CustMatchCount = count(*) from Task where MPDReference in( select ENG_CUSTOMERTALLY_CUSTOMERTASKNUMBER from dbo.ENG_CUSTOMERTALLY) if(@CustTotalCount>@CustMatchCount) select distinct substring(ENG_CUSTOMERMYCROSS_MYTECHNIC_TASK_NO, charindex('-', ENG_CUSTOMERMYCROSS_MYTECHNIC_TASK_NO) + 1, 1000) from dbo.ENG_CUSTOMERMYCROSS where ENG_CUSTOMERMYCROSS_CUSTOMER_NUMBER in( select ENG_CUSTOMERTALLY_CUSTOMERTASKNUMBER from ENG_CUSTOMERTALLY1 except select MPDReference from Task ) 

我可以转换

  - A320-200001-01-1(1) - A320-200001-02-1(2) - A320-200001-01-1(2) - A320-200001-01-1(1) - A320-200001-01-1(2) - A320-200001-02-1(1) 

 - 200001-01-1(1) - 200001-02-1(2) - 200001-01-1(2) - 200001-01-1(1) - 200001-01-1(2) - 200001-02-1(1) 

但我需要:

 - 200001-01-1 - 200001-02-1 - 200001-01-1 - 200001-01-1 - 200001-01-1 - 200001-02-1 

我怎么能在SQL和C#中做到这一点?

模式是否始终相同,如果是这样,您可以使用SUBSTRING来拉出您想要的位。

编辑:接受我在如何使用SQL中的子字符串中提出的其他内容?

你可以

 SELECT DISTINCT SUBSTRING(....) FROM ... 

如上所述,使用SUBSTRING方法,但只要数据始终采用上面显示的格式,就使用长度为11而不是1000。

在C#中它将是:

 string s = "A320-20001-01-1(1)"; string result = s.Substring(s.IndexOf('-'), 11); 

再假设您想要的部分总是11个字符。 否则,如果它始终是第一个’(’你想要结束之前,你再次使用IndexOf方法/函数来查找结束索引并减去第一个索引

尝试substring和len,这个样本削减前6和后4(4 = 10-6)个字符

 declare @var varchar(50) set @var = 'A320-200001-01-1(1) select substring(@var, 6, len(@var) - 10) 

输出:200001-01

在c#中,函数类似,执行从零开始的索引:

  string var = "A320-200001-01-1(1)"; var = var.Substring(5, var.Length - 8); Console.WriteLine(var); 

这是一种使用PATINDEX的技术,它可以使用通配符。

 SUBSTRING(ENG_CUSTOMERMYCROSS_MYTECHNIC_TASK_NO, PATINDEX('%[0-9]%', ENG_CUSTOMERMYCROSS_MYTECHNIC_TASK_NO), PATINDEX('%(%', ENG_CUSTOMERMYCROSS_MYTECHNIC_TASK_NO) - PATINDEX('%[0-9]%', ENG_CUSTOMERMYCROSS_MYTECHNIC_TASK_NO) ) 

子字符串的开头是第一个数值的位置(%[0-9]%)。 长度值是第一个括号的位置(’%(%’)减去起始位置。