2

我有一个字符串,比如prop234字母部分有固定长度,但数字部分可以是任意长度

我必须从 T-SQL 中的字符串中获取数字部分(在 SQL Server 2008 上)

我尝试了SUBSTRING函数,但我不知道数字部分的长度,所以无法提供第三个参数,即长度

SUBSTRING ( expression ,start , length )

我知道起始索引,但长度可以是任何东西

一种解决方案是

SELECT substring([ColumnName], 5, LEN(ColumnName) - 4)

因为起始索引是固定的,即字母部分的长度是 4(固定)

有没有更好的解决方案,如果字母部分的长度不是恒定的怎么办?

4

5 回答 5

3
select stuff('prop234', 1,4,'')

如果长度不是常数:

declare @t table(expression varchar(100))
insert @t values('propprop234')

select stuff(expression, 1, patindex('%_[0-9]%', expression), '') from @t

编辑:为确保处理不良数据,例如首先没有文本或最后没有数字,这里有一个稍微不同的方法:

select stuff(expression, 1,patindex('%[^0-9][0-9]%', expression + '0'), '') 
from @t 
于 2012-06-21T08:26:40.873 回答
1

您根本不需要计算字符串其余部分的长度。以下将正常工作。

SELECT substring([ColumnName], PATINDEX('%0-9%',[ColumnName]),8000) 
于 2012-06-25T05:18:37.347 回答
1

无论它有多长或字母部分有多长,这都应该得到数字:

declare @str as varchar(50)
declare @pos as integer

set @str = 'abdfgdfghhcd123456784564690'
set @pos =  PATINDEX('%[0-9]%',@str)

select substring(@str, @pos,len(@str)-@pos+1)
于 2012-06-21T07:49:17.973 回答
0

If your "prefix" is always 4 chars, you can writesomething like:

declare @v varchar(max) = 'prop234'

select substring(@v, 5, DATALENGTH(@v))

select @v = 'prop567890'

select substring(@v, 5, DATALENGTH(@v))
于 2012-06-21T06:42:09.777 回答
0

您可以使用用户定义函数 (UDF) 从包含数字、特殊字符等的字符串中仅获取字母。

IF object_id('dbo.GetAlpha') is not NULL
   DROP FUNCTION GetAlpha
GO

CREATE FUNCTION GetAlpha (@strAlpha VARCHAR(256)) 
RETURNS VARCHAR(256)
AS

BEGIN
DECLARE  @intAlpha INT
SET      @intAlpha = PATINDEX('%[^a-z]%', @strAlpha)

BEGIN
WHILE    @intAlpha > 0
BEGIN
SET @strAlpha = STUFF(@strAlpha, @intAlpha, 1, '' )
SET @intAlpha = PATINDEX('%[^a-z]%', @strAlpha)
END
END
RETURN ISNULL(@strAlpha,0)
END
GO

示例如何使用函数

select dbo.getalpha('stackoverflow102020');

-------------
stackoverflow
于 2012-06-21T06:38:21.593 回答