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





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.
Приведенный мной код извлечет буквенную часть, как и было запрошено. Если это не то, что вам нужно, обновите свой вопрос :-)
хорошо, извини, теперь я понял. Что, если бы я хотел извлечь числовую часть?
Я получил сообщение об ошибке: недопустимый параметр длины передан функции RIGHT.
Да, так как я могу это проверить?
Одна из ваших строк не начинается с «BTA». Я добавил проверку для этого, но на самом деле ответ "G Mastros" более полный, чем мой.
Вы правы, имя столбца называется GSA, поэтому я сделал ПРАВИЛЬНО (GSA, LEN (GSA) - 3), но, как вы отметили, не все GSA имеют длину 3, что приведет к отрицательному значение для второго параметра функции ВПРАВО.
Я бы порекомендовал комбинацию 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
В этой статье показано, как получить числа из строки. В вашем случае вместо этого вы хотите получить альфа-символы. Однако процесс достаточно похож, так что вы, вероятно, сможете извлечь из него что-то полезное.
Как мне извлечь только числовую часть?
Посмотрите ссылку, которую я предоставил. Существует определяемая пользователем функция, которую можно использовать для извлечения только числовой части.
Является ли 8000, которые вы использовали в ссылке, произвольным числом?
Я использовал 8000, потому что это самая большая длина, которую вы можете использовать для столбца varchar. Я решил использовать varchar (8000) вместо varchar (max), чтобы эту функцию можно было использовать с SQL2000. Если вы используете SQL2005 (или выше), вы можете изменить 8000 на макс.
Я пробовал это для извлечения числа, но он вернул пробелы: LEFT (SubString (GSA, PatIndex ('% [0-9]%', GSA), 8000), PatIndex ('% [0-9]%', SubString) (GSA, PatIndex ('% [0-9]%', GSA), 8000) + '1') - 1)
Вы реализовали это неправильно. Чтобы получить числа ... ВЛЕВО (ПОДСТРОКА (GSA, PATINDEX ('% [0-9]%', GSA), 8000), PATINDEX ('% [^ 0-9]]%', ПОДСТРОКА (G SA, PATINDEX ('% [0-9]% ', GSA), 8000) + 'X') - 1)
Хорошо, отлично, что сработало. Спасибо за помощь, 2 вопроса: что делает 'X', почему я не могу просто поставить, например, '1' и что делает символ ^ в '% [^ 0-9]%'? Еще раз спасибо
^ В поиске означает НЕ. % [^ 0-9]% ищет первый символ, который НЕ равен от 0 до 9. Вы должны убедиться, что PatIndex не возвращает 0. Если PatIndex не находит совпадения, он возвращает 0. Для этой функции это будет лучше вернуть длину строки, поэтому + 'X'. Есть смысл?
Часть ^ работает, но является ли «X» предопределенным ключевым словом в PatIndex? Я не уверен, почему вы не можете просто использовать «1» вместо «X»
Выполните это: Выберите PatIndex ('% [^ 0-9]%', '123') ... PatIndex возвращает 0. Затем мы используем левую функцию с PatIndex - 1. Если PatIndex возвращает 0, мы получаем Left (Data, PatIndex-1) или Left (Data, -1), что приведет к ошибке. Жестко кодируя что-то подходящее, мы гарантируем, что левая функция работает.
Хорошо, это потому, что вы добавляете символ «X» к алфавитной части строки?
Да. Точно. Он существует ТОЛЬКО для того, чтобы спасти нас от получения ошибки, когда строка состоит из ВСЕХ цифр.
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
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
что, если он различается по длине, например, BTA10 или BTA1?