问题描述
下面是这些字段的示例
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]
。
当字符串是否以字母/非数字开头时,NULLIF
和ISNULL
在那里,因此不会由于第三个参数而导致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
的列。您应该更改此设置,以使用任何实际的列。
关于区分大小写:如果您使用的是不区分大小写排序规则,那么它将毫无问题地起作用。如果您的排序规则是区分大小写,则可能需要更改要匹配的模式以迎合大小写字母。