如何在t-sql中提取部分字符串

时间:2008-12-17 16:29:05

标签: sql-server tsql string

如果我有以下nvarchar变量 - BTA200,我怎样才能从中提取BTA?

另外,如果我有不同长度,如BTA50,BTA030,我怎样才能提取数字部分?

4 个答案:

答案 0 :(得分:36)

我会推荐PatIndex和Left的组合。精心构建,无论数据如何,您都可以编写始终有效的查询。

例如:

Declare @Temp Table(Data VarChar(20))

Insert Into @Temp Values('BTA200')
Insert Into @Temp Values('BTA50')
Insert Into @Temp Values('BTA030')
Insert Into @Temp Values('BTA')
Insert Into @Temp Values('123')
Insert Into @Temp Values('X999')

Select Data, Left(Data, PatIndex('%[0-9]%', Data + '1') - 1)
From   @Temp

PatIndex将查找落在0-9范围内的第一个字符,并返回它的字符位置,您可以使用LEFT函数提取正确的数据。请注意,PatIndex实际上使用Data +'1'。这可以保护我们免受没有找到号码的数据的影响。如果没有数字,PatIndex将返回0.在这种情况下,LEFT函数会出错,因为我们使用Left(Data,PatIndex - 1)。当PatIndex返回0时,我们最终会得到Left(Data,-1),返回错误。

仍然有可能失败的方法。如需完整解释,我建议您阅读:

Extracting numbers with SQL Server

那篇文章展示了如何从字符串中获取数字。在您的情况下,您希望获得字母字符。但是,这个过程很相似,你可以从中学到一些有用的东西。

答案 1 :(得分:6)

substring(field,1,3)将适用于您的示例。

select substring(field, 1,3) from table

此外,如果字母部分的长度可变,您可以这样做以提取字母部分:

select substring(field, 1, PATINDEX('%[1234567890]%', field) -1) 
from table
where PATINDEX('%[1234567890]%', field) > 0

答案 2 :(得分:3)

LEFT('BTA200',3)适用于您提供的示例,如:

SELECT LEFT(MyField, 3)
FROM MyTable

要提取数字部分,您可以使用此代码

SELECT RIGHT(MyField, LEN(MyField) - 3)
FROM MyTable
WHERE MyField LIKE 'BTA%' 
--Only have this test if your data does not always start with BTA.

答案 3 :(得分:1)

declare @data as varchar(50)
set @data='ciao335'


--get text
Select Left(@Data, PatIndex('%[0-9]%', @Data + '1') - 1)    ---->>ciao

--get numeric
Select right(@Data, len(@data) - (PatIndex('%[0-9]%', @Data )-1) )   ---->>335