Если у меня есть следующая переменная nvarchar - BTA200, как я могу извлечь из нее только BTA?
Кроме того, если у меня есть различные длины, такие как BTA50, BTA030, как я могу извлечь только числовую часть?
Если у меня есть следующая переменная nvarchar - BTA200, как я могу извлечь из нее только BTA?
Кроме того, если у меня есть различные длины, такие как BTA50, BTA030, как я могу извлечь только числовую часть?
Я бы рекомендовал комбинацию 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), который возвращает ошибку.
Есть еще способы, которые могут потерпеть неудачу. Для полного объяснения я рекомендую вам прочитать:
Извлечение чисел с помощью SQL Server
В этой статье показано, как получить номера из строки. В вашем случае вы хотите получить буквенные символы. Тем не менее, процесс достаточно схожим, что вы, вероятно, можете извлечь из него что-то полезное.
(поле, 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