我有一个像prop234
这样的字符串,字母部分有固定长度,但数字部分可以是任意长度
我必须从T-SQL中的字符串中获取数字部分(在SQL Server 2008上)
我尝试使用SUBSTRING
函数,但我不知道数字部分的长度,因此无法提供第三个参数,即长度
SUBSTRING ( expression ,start , length )
我知道起始索引,但长度可以是任何
一个解决方案是
SELECT substring([ColumnName], 5, LEN(ColumnName) - 4)
作为起始索引是固定的,即字母表部分的长度是4(固定)
有没有更好的解决方案,如果字母部分的长度不恒定怎么办?
答案 0 :(得分: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
答案 1 :(得分: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)
答案 2 :(得分:1)
您根本不需要计算字符串剩余部分的长度。以下工作正常。
SELECT substring([ColumnName], PATINDEX('%0-9%',[ColumnName]),8000)
答案 3 :(得分: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
答案 4 :(得分:0)
如果你的“前缀”总是4个字符,你可以写下如下内容:
declare @v varchar(max) = 'prop234'
select substring(@v, 5, DATALENGTH(@v))
select @v = 'prop567890'
select substring(@v, 5, DATALENGTH(@v))