Подтвердить что ты не робот

Как извлечь часть строки в t-sql

Если у меня есть следующая переменная nvarchar - BTA200, как я могу извлечь из нее только BTA?

Кроме того, если у меня есть различные длины, такие как BTA50, BTA030, как я могу извлечь только числовую часть?

4b9b3361

Ответ 1

Я бы рекомендовал комбинацию 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

В этой статье показано, как получить номера из строки. В вашем случае вы хотите получить буквенные символы. Тем не менее, процесс достаточно схожим, что вы, вероятно, можете извлечь из него что-то полезное.

Ответ 2

Подстрока

(поле, 1,3) будет работать на ваших примерах.

select substring(field, 1,3) from table

Кроме того, если алфавитная часть имеет переменную длину, вы можете сделать это, чтобы извлечь алфавитную часть:

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

Ответ 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.

Ответ 4

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