【发布时间】:2008-12-17 16:29:05
【问题描述】:
如果我有以下 nvarchar 变量 - BTA200,如何从中提取 BTA?
另外,如果我有不同的长度,例如 BTA50、BTA030,我怎样才能只提取数字部分?
【问题讨论】:
标签: sql-server tsql string
如果我有以下 nvarchar 变量 - BTA200,如何从中提取 BTA?
另外,如果我有不同的长度,例如 BTA50、BTA030,我怎样才能只提取数字部分?
【问题讨论】:
标签: sql-server tsql string
我会推荐 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
那篇文章展示了如何从字符串中获取数字。在您的情况下,您想要获取字母字符。但是,这个过程非常相似,您可能可以从中学到一些有用的东西。
【讨论】:
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
【讨论】:
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.
【讨论】:
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
【讨论】: