Как извлечь часть строки в T-SQL - PullRequest
20 голосов
/ 17 декабря 2008

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

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

Ответы [ 4 ]

36 голосов
/ 17 декабря 2008

Я бы порекомендовал комбинацию PatIndex и Left. Тщательно продуманный, вы можете написать запрос, который всегда работает, независимо от того, как выглядят ваши данные.

Ex:

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, и возвращает его положение символа, которое вы можете использовать с функцией ВЛЕВО, чтобы извлечь правильные данные. Обратите внимание, что PatIndex фактически использует Data + '1'. Это защищает нас от данных, где номера не найдены. Если чисел нет, PatIndex вернет 0. В этом случае функция LEFT выдаст ошибку, потому что мы используем Left (Data, PatIndex - 1). Когда PatIndex возвращает 0, мы получим Left (Data, -1), который возвращает ошибку.

Есть еще способы, которыми это может потерпеть неудачу. Для полного объяснения, я призываю вас прочитать:

Извлечение чисел с помощью SQL Server

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

6 голосов
/ 17 декабря 2008

подстрока (поле, 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 голосов
/ 17 декабря 2008

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.
1 голос
/ 31 июля 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...