Подстрока не работает во всех моих случаях, как я могу это исправить? - PullRequest
1 голос
/ 10 июля 2019

У меня есть запрос подстроки, который работает, но он прерывается, если после моего поискового запроса нет слов. Я не знаю, как это исправить.

Я пытался удалить и изменить числа +1 +2 -1 -2 после len, но у меня не было шансов заставить его работать.

declare 
@FullText nvarchar(400) = 'My Code in ''ABC123, CDE456'' and my digit 1',
@KnownBeginning nvarchar(400) = 'Code in ''',
@KnownEnding nvarchar(400) = ''' '

select SUBSTRING(@FullText, CHARINDEX(@KnownBeginning, @FullText) + LEN(@KnownBeginning) , 
            CHARINDEX(@KnownEnding,@FullText) - (CHARINDEX(@KnownBeginning, @FullText)
            + LEN(@KnownBeginning)))


--@FullText2 nvarchar(400) = 'My Code in ''ABC123, CDE456'''

Код работает выше, но если мы заменим @FullText на @ FullText2, в котором нет текста после '' - "и моей цифры 1", выбор прерывается. Кажется, что подстрока работает, если после поиска искомой строки есть какой-либо текст. Но если после '' ABC123, CDE456 '' больше ничего не написано:

Сообщение 537, уровень 16, состояние 3, строка 7 Недопустимый параметр длины, переданный в функцию LEFT или SUBSTRING.

Выбор должен возвращаться всегда, если после кавычек есть или нет текста.

1 Ответ

1 голос
/ 10 июля 2019

Вы можете попробовать что-то подобное:

DECLARE @tbl TABLE(YourString VARCHAR(100));
INSERT INTO @tbl VALUES
 ('My Code in ''ABC123, CDE456'' and my digit 1')
,('My Code in ''ABC123, CDE456''');

SELECT t.YourString
      ,A.CastedToXml.query('.') AS ThisIsHowItLooksLike
      ,A.CastedToXml.value('/x[2]','varchar(100)') AS TheSecondElement
FROM @tbl t
CROSS APPLY(SELECT CAST('<x>' + REPLACE(t.YourString,'''','</x><x>') + '</x>' AS XML)) A(CastedToXml);

Щелкните по узлу XML, чтобы увидеть промежуточное приведенное значение.Мы можем использовать .value(), чтобы выбрать вторую <x>, которая является вашими данными.

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

DECLARE @KnownBeginning nvarchar(400) = 'Code in ''', 
        @KnownEnding nvarchar(400) = ''''; --<-- Without the blank!

SELECT t.YourString
      ,SUBSTRING(t.YourString,A.StartPosition,B.EndPosition-A.StartPosition) AS TheCodes
FROM @tbl t
CROSS APPLY(SELECT CHARINDEX(@KnownBeginning,t.YourString) + LEN(@KnownBeginning)) A(StartPosition)
OUTER APPLY(SELECT CHARINDEX(@KnownEnding,t.YourString,A.StartPosition+1)) B(EndPosition);

Я использую APPLY длявычислить значения построчно .Это позволяет использовать вычисленные значения, подобные переменным, в процедурных подходах.Первый APPLY вычисляет начальную точку, а второй APPLY использует StartPosition в качестве смещения .Поэтому нам не нужен бланк после цитаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...