如果我有以下nvarchar变量 - BTA200,我怎样才能从中提取BTA?
另外,如果我有不同长度,如BTA50,BTA030,我怎样才能提取数字部分?
答案 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