Как извлечь часть строки в T-SQL

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

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

Ответы на вопрос(4)

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

select substring(field, 1,3) from table

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

select substring(field, 1, PATINDEX('%[1234567890]%', field) -1) 
from table
where PATINDEX('%[1234567890]%', field) > 0
Решение Вопроса

анный, вы можете написать запрос, который всегда работает, независимо от того, как выглядят ваши данные.

Пример:

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

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

 Xaisoft17 дек. 2008 г., 18:56
Отлично. Спасибо за терпение.
 Xaisoft17 дек. 2008 г., 18:54
Хорошо, это потому, что вы добавляете символ «X» в алфавитную часть строки?
 Xaisoft17 дек. 2008 г., 18:33
Часть ^ делает, но является ли 'X' предопределенным ключевым словом в PatIndex? Я не уверен, почему вы не можете просто использовать «1» вместо «X»
 Xaisoft17 дек. 2008 г., 18:25
Ок, отлично, это сработало Спасибо за помощь, 2 вопроса: что делает «X», почему я не могу просто поставить «1», например, и что символ ^ делает в «% [^ 0-9]%»? еще раз спасибо
 G Mastros17 дек. 2008 г., 18:12
Вы реализовали это неправильно. Чтобы получить числа ... LEFT (SUBSTRING (GSA, PATINDEX ('% [0-9]%', GSA), 8000), PATINDEX ('% [^ 0-9]%', SUBSTRING (GSA, PATINDEX ( «% [0-9]%», GSA), 8000) + «X») - 1)
 Xaisoft17 дек. 2008 г., 17:55
Является ли 8000, который вы использовали в ссылке, просто произвольным числом?
 G Mastros17 дек. 2008 г., 18:55
Да. Именно так. Он существует ТОЛЬКО для того, чтобы избавить нас от получения ошибки, когда строка ВСЕ числовые.
 G Mastros17 дек. 2008 г., 18:31
^ В поиске означает НЕ. % [^ 0-9]% ищет первый символ, который НЕ от 0 до 9. Вам нужно убедиться, что PatIndex не возвращает 0. Если PatIndex не находит соответствия, он возвращает 0. Для этой функции это будет лучше вернуть длину строки, отсюда + 'X'. Есть смысл?
 Xaisoft17 дек. 2008 г., 17:49
Как мне извлечь только числовую часть?
 G Mastros17 дек. 2008 г., 18:43
Запустите это: выберите PatIndex ('% [^ 0-9]%', '123') ... PatIndex возвращает 0. Далее, мы используем левую функцию с PatIndex - 1. Если PatIndex возвращает 0, мы заканчиваем с левой (Data, PatIndex-1) или Left (Data, -1), что может привести к ошибке. Путем жесткого кодирования того, что соответствует, мы гарантируем, что левая функция работает
 Xaisoft17 дек. 2008 г., 18:07
Я попытался это извлечь число, но он возвратил пробелы: LEFT (SubString (GSA, PatIndex ('% [0-9]%', GSA), 8000), PatIndex ('% [0-9]%', SubString) (GSA, PatIndex ('% [0-9]%', GSA), 8000) + '1') - 1)
 G Mastros17 дек. 2008 г., 17:50
Посмотрите на ссылку, которую я предоставил. Существует определенная пользователем функция, которую вы можете использовать для извлечения только числовой части.
 G Mastros17 дек. 2008 г., 17:57
Я использовал 8000, потому что это самая большая длина, которую вы можете использовать для столбца varchar. Я решил использовать varchar (8000) вместо varchar (max), чтобы эту функцию можно было использовать с SQL2000. Если вы используете SQL2005 (или выше), вы можете изменить 8000 на макс.

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.
 Xaisoft17 дек. 2008 г., 17:41
Да, так как я могу проверить это?
 Xaisoft17 дек. 2008 г., 17:32
Что делать, если длина варьируется, например, BTA10 или BTA1?
 RB.17 дек. 2008 г., 17:33
Код, который я дал, будет извлекать алфавитную часть, как требуется. Если это не то, что вам нужно, пожалуйста, обновите ваш вопрос :-)
 Xaisoft17 дек. 2008 г., 17:38
Я получил ошибку: неверный параметр длины передан в функцию RIGHT.
 Xaisoft17 дек. 2008 г., 17:45
Вы правы, название столбца называется GSA, поэтому я сделал ПРАВО (GSA, LEN (GSA) - 3), но, как вы указали, не все GSA имеют длину 3, что приведет к отрицательному значению. значение для второго параметра функции RIGHT.
 RB.17 дек. 2008 г., 17:41
Одна из ваших строк не начинается с 'BTA'. Я добавил проверку для этого, но на самом деле ответ «G Mastros» является более полным, чем мой.
 Xaisoft17 дек. 2008 г., 17:34
хорошо, извини, я вижу это сейчас. Что если я хочу извлечь числовую часть?
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

Ваш ответ на вопрос