【问题标题】:Remove characters before '-' and after '-' keeping the middle of the string that contain more one character '-'删除 '-' 之前和之后的字符 '-' 保留包含多个字符 '-' 的字符串中间
【发布时间】:2021-04-20 19:13:37
【问题描述】:

我的数据库中有以下条目(varchar 数据类型):

 5-359-258756-54
 2-456-58994-85
 4-458 -478698-42
 5-876-5878-26

我想排除第一个数字加上字符'-',最后两个数字加上前一个'-',并删除中间字符'-'中可用的空格。

最终结果必须是:

 359-258756
 456-58994
 458-478698
 876-5878

根据论坛建议,我尝试主要使用 charindex 和 patindex 替换 '','',但没有显示预期结果,我可以返回的最接近的是 458-478698-42(删除第一个数字加字符和空间),

我该如何解决?

【问题讨论】:

  • 您的 SQL Server 版本是多少?
  • 微软 Azure SQL 数据仓库 - 10.0.15996.0
  • SELECT @@VERSION;的结果吗?
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql


【解决方案1】:

如果你的字符串格式是一致的,那么你一个使用parsename()

示例

Declare @YourTable table (SomeCol varchar(50))
Insert Into @YourTable values
 ('5-359-258756-54')
,('2-456-58994-85')
,('4-458 -478698-42')
,('5-876-5878-26')

Select *
      ,NewVal = replace(parsename(replace(SomeCol,'-','.'),3)
                        +'-'
                        +parsename(replace(SomeCol,'-','.'),2)
                       ,' ','')
 From  @YourTable

结果

SomeCol             NewVal
5-359-258756-54     359-258756
2-456-58994-85      456-58994
4-458 -478698-42    458-478698
5-876-5878-26       876-5878

【讨论】:

  • 它有效,非常感谢约翰。顺便说一下我不知道SQL中的parsename()函数,这对我来说是一个新的学习,非常感谢!
  • @ito 总是乐于提供帮助。实际上 parsename() 是在 v2008 中引入的。
  • @ito 请记住 parsename() 只能处理 4 个元素。 1-4 从右到左。
  • 当输入对于对象名称无效时,ParseName 会失败 hard,例如select ParseName( N'D.C.B.A.Oops', 3 ); 返回NULL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2020-07-29
  • 1970-01-01
  • 2022-11-22
  • 2016-07-01
  • 2015-07-23
  • 1970-01-01
相关资源
最近更新 更多