从字符串开头提取所有数字?

问题描述

我有一个表,其中包含一些我要清除的不良数据。

下面是这些字段的示例

36234735HAN876

2342JOE9823

554444PUT003

我要删除的是第一个字母字符之前的所有数字字符,如下所示:

HAN876

JOE9823

PUT003

实现此目标的最佳方法是什么?我使用了下面的方法,但这只能用于从字符串中提取所有数字,而不能提取字母字符之前的数字

How to get the numeric part from a string using T-SQL?

解决方法

使用PATINDEX查找第一个非数字字符(或第一个字母字符,具体取决于逻辑),然后使用STUFF删除它们:

SELECT STUFF(V.YourString,1,ISNULL(NULLIF(PATINDEX('%[^0-9]%',V.YourString),0)-1,0),'')
FROM (VALUES('36234735HAN876'),('2342JOE9823'),('554444PUT003'),('ABC123'))V(YourString)

如果逻辑是第一个字母字符,而不是第一个非数字字符,则模式将为[A-z]

当字符串是否以字母/非数字开头时,NULLIFISNULL在那里,因此不会由于第三个参数而导致STUFF出错为-1。我在示例数据('ABC123')中放入了另一个示例,对此进行了演示。

,

您可以使用PATINDEX找到字符串中字母字符的第一个位置,然后使用SUBSTRING仅返回该位置之后的字符来实现此目的:

CREATE TABLE #temp (val VARCHAR(50));
INSERT INTO #temp VALUES ('36234735HAN876'),('TEST1234');

SELECT  val,SUBSTRING(val,PATINDEX('%[A-Z]%',val),LEN(val)) AS output
  FROM  #temp;

DROP TABLE #temp;

输出:

val             output
36234735HAN876  HAN876
2342JOE9823     JOE9823
554444PUT003    PUT003
TEST1234        TEST1234

请注意,我已经创建了一个临时表,其中包含名为val的列。您应该更改此设置,以使用任何实际的列。

关于区分大小写:如果您使用的是不区分大小写排序规则,那么它将毫无问题地起作用。如果您的排序规则是区分大小写,则可能需要更改要匹配的模式以迎合大小写字母。