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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
0
125 423
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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.

что, если он различается по длине, например, BTA10 или BTA1?

Xaisoft 17.12.2008 19:32

Приведенный мной код извлечет буквенную часть, как и было запрошено. Если это не то, что вам нужно, обновите свой вопрос :-)

RB. 17.12.2008 19:33

хорошо, извини, теперь я понял. Что, если бы я хотел извлечь числовую часть?

Xaisoft 17.12.2008 19:34

Я получил сообщение об ошибке: недопустимый параметр длины передан функции RIGHT.

Xaisoft 17.12.2008 19:38

Да, так как я могу это проверить?

Xaisoft 17.12.2008 19:41

Одна из ваших строк не начинается с «BTA». Я добавил проверку для этого, но на самом деле ответ "G Mastros" более полный, чем мой.

RB. 17.12.2008 19:41

Вы правы, имя столбца называется GSA, поэтому я сделал ПРАВИЛЬНО (GSA, LEN (GSA) - 3), но, как вы отметили, не все GSA имеют длину 3, что приведет к отрицательному значение для второго параметра функции ВПРАВО.

Xaisoft 17.12.2008 19:45
Ответ принят как подходящий

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

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

Как мне извлечь только числовую часть?

Xaisoft 17.12.2008 19:49

Посмотрите ссылку, которую я предоставил. Существует определяемая пользователем функция, которую можно использовать для извлечения только числовой части.

George Mastros 17.12.2008 19:50

Является ли 8000, которые вы использовали в ссылке, произвольным числом?

Xaisoft 17.12.2008 19:55

Я использовал 8000, потому что это самая большая длина, которую вы можете использовать для столбца varchar. Я решил использовать varchar (8000) вместо varchar (max), чтобы эту функцию можно было использовать с SQL2000. Если вы используете SQL2005 (или выше), вы можете изменить 8000 на макс.

George Mastros 17.12.2008 19:57

Я пробовал это для извлечения числа, но он вернул пробелы: LEFT (SubString (GSA, PatIndex ('% [0-9]%', GSA), 8000), PatIndex ('% [0-9]%', SubString) (GSA, PatIndex ('% [0-9]%', GSA), 8000) + '1') - 1)

Xaisoft 17.12.2008 20:07

Вы реализовали это неправильно. Чтобы получить числа ... ВЛЕВО (ПОДСТРОКА (GSA, PATINDEX ('% [0-9]%', GSA), 8000), PATINDEX ('% ‌ [^ 0-9]]%', ПОДСТРОКА (G‌ SA, PATINDEX ('% [0-9]% ‌', GSA), 8000) + 'X') - 1)

George Mastros 17.12.2008 20:12

Хорошо, отлично, что сработало. Спасибо за помощь, 2 вопроса: что делает 'X', почему я не могу просто поставить, например, '1' и что делает символ ^ в '% [^ 0-9]%'? Еще раз спасибо

Xaisoft 17.12.2008 20:25

^ В поиске означает НЕ. % [^ 0-9]% ищет первый символ, который НЕ равен от 0 до 9. Вы должны убедиться, что PatIndex не возвращает 0. Если PatIndex не находит совпадения, он возвращает 0. Для этой функции это будет лучше вернуть длину строки, поэтому + 'X'. Есть смысл?

George Mastros 17.12.2008 20:31

Часть ^ работает, но является ли «X» предопределенным ключевым словом в PatIndex? Я не уверен, почему вы не можете просто использовать «1» вместо «X»

Xaisoft 17.12.2008 20:33

Выполните это: Выберите PatIndex ('% [^ 0-9]%', '123') ... PatIndex возвращает 0. Затем мы используем левую функцию с PatIndex - 1. Если PatIndex возвращает 0, мы получаем Left (Data, PatIndex-1) или Left (Data, -1), что приведет к ошибке. Жестко кодируя что-то подходящее, мы гарантируем, что левая функция работает.

George Mastros 17.12.2008 20:43

Хорошо, это потому, что вы добавляете символ «X» к алфавитной части строки?

Xaisoft 17.12.2008 20:54

Да. Точно. Он существует ТОЛЬКО для того, чтобы спасти нас от получения ошибки, когда строка состоит из ВСЕХ цифр.

George Mastros 17.12.2008 20:55

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

Другие вопросы по теме