Неожиданный вывод в SQL Server

#sql-server

#sql-сервер

Вопрос:

У меня есть строка, мне нужно получить символы в квадратных скобках

 declare  @String Varchar(50)
Set @String ='C910-C916[02]'

Select 
    Substring(Rtrim(Ltrim(@String)), CHARINDEX('[', Rtrim(Ltrim(@string)))   1, (len(@string) - 1)) val3  
  

Вывод:

 vol3
02]
  

Но ожидаемый результат

  vol3
 02
  

Что не так в этом запросе?

Комментарии:

1. Ваш последний параметр в функции substring (которая определяет длину подстроки, которую вы хотите взять) — это, (len(@string)-1) который 12 , вам нужны только два. Если длина является динамической, вам придется ее вычислить.

2. Третьим параметром SUBSTRING является length , для которого вы указали len(@string)-1 (длина всей вашей строки минус 1 ).

Ответ №1:

Вы можете использовать следующее:

 DECLARE @String VARCHAR(50)
SET @String ='C910-C916[02]'

-- output: 02
SELECT SUBSTRING(RTRIM(LTRIM(@String)), CHARINDEX('[', RTRIM(LTRIM(@String)))   1, CHARINDEX(']', RTRIM(LTRIM(@String))) - CHARINDEX('[', RTRIM(LTRIM(@String)))-1) val3  
  

С помощью этого решения вы также можете получить число в середине, если текст:

 DECLARE @String VARCHAR(50)
SET @String ='C910-C916[02] Hello World'

-- output: 02
SELECT SUBSTRING(RTRIM(LTRIM(@String)), CHARINDEX('[', RTRIM(LTRIM(@String)))   1, CHARINDEX(']', RTRIM(LTRIM(@String))) - CHARINDEX('[', RTRIM(LTRIM(@String)))-1) val3  
  

Комментарии:

1. Для меня это нормально работает. Спасибо, Себастьян Брош

Ответ №2:

Вы также могли бы сделать:

 SELECT PARSENAME(REPLACE(@String,'[','.['),1);