T-SQL选择查询以删除非数字字符?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (367)

我在具有可变alpha长度的列中有脏数据。我只想删掉任何不是0-9的东西。

我不想运行函数或proc。我有一个类似于在文本后抓取数值的脚本,它看起来像这样:

Update TableName
set ColumntoUpdate=cast(replace(Columnofdirtydata,'Alpha #','') as int)
where Columnofdirtydata like 'Alpha #%'
And ColumntoUpdate is Null

我认为它会工作得很好,直到我发现我认为只有Alpha#12345789格式的某些数据字段不...

需要剥离的数据示例

AB ABCDE # 123
ABCDE# 123
AB: ABC# 123

我只想要123.确实所有数据字段的数字都在#之前。

我尝试了substring和PatIndex,但我的语法不正确或者其他东西。任何人对解决这个问题的最佳方法有任何建议吗?

谢谢!

提问于
用户回答回答于

请参阅此博客文章,了解从SQL Server中的字符串中提取数字。下面是您的示例中使用字符串的示例:

DECLARE @textval NVARCHAR(30)
SET @textval = 'AB ABCDE # 123'

SELECT LEFT(SUBSTRING(@textval, PATINDEX('%[0-9.-]%', @textval), 8000),
           PATINDEX('%[^0-9.-]%', SUBSTRING(@textval, PATINDEX('%[0-9.-]%', @textval), 8000) + 'X') -1)
用户回答回答于

如果您的服务器支持TRANSLATE功能,那么这是一个优雅的解决方案(在sql server上,它可以在sql server 2017+以及sql azure上使用)。

首先,它用@字符替换任何非数字字符。然后,它删除所有@字符。您可能需要添加您知道可能存在于TRANSLATE调用的第二个参数中的其他字符。

select REPLACE(TRANSLATE([Col], 'abcdefghijklmnopqrstuvwxyz+()- ,#+', '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'), '@', '')

扫码关注云+社区

领取腾讯云代金券