Извлечь определенную строку после некоторого выражения - PullRequest
1 голос
/ 04 апреля 2019

У меня есть таблица customer_info, в которой столбец PrintData, который содержит много информации.Я хотел бы получить идентификатор транзакции из этого столбца.

Данные столбца выглядят так:

    <Line28>.TVR: 4000008000</Line28>
    <Line29>.IAD: 06020103649D00</Line29>
    <Line30>.TSI: E800</Line30>
    <Line31>.ARC: 00</Line31>
    <Line32>.CVM: PIN VERIFIED</Line32>
    <Line33>.TRAN ID: 000000000075169</Line33>

Я хотел бы получить только 000000000075169, т.е. TRAN ID:

Я пробовал это как:

SUBSTRING(PrintData,CHARINDEX('TRAN ID: ',PrintData),CHARINDEX('</Li',PrintData))

, но он не дает ответа на запись.

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Можете ли вы, пожалуйста, следующий запрос.

DECLARE @PrintData AS VARCHAR (200) = '<Line33>.TRAN ID: 000000000075169</Line33>';

SELECT SUBSTRING(@PrintData, 
                 CHARINDEX('TRAN ID: ', @PrintData) + LEN('TRAN ID: '), 
                 CHARINDEX('</Li',@PrintData) - (CHARINDEX('TRAN ID: ', @PrintData) + LEN('TRAN ID: '))
                 );

Синтаксис SUBSTRING (expression, start_position, length)

ОБНОВЛЕНИЕ:

Согласно комментарию MarcinJ, для множественного экземпляра </Line, следующий запрос будет работать.

DECLARE @PrintData VARCHAR(2000) = '
    <Line28>.TVR: 4000008000</Line28>
    <Line29>.IAD: 06020103649D00</Line29>
    <Line30>.TSI: E800</Line30>
    <Line31>.ARC: 00</Line31>
    <Line32>.CVM: PIN VERIFIED</Line32>
    <Line33>.TRAN ID: 000000000075169</Line33>
    ';

DECLARE @FindString AS VARCHAR (20) = 'TRAN ID: ';
DECLARE @LenFindString AS INT = LEN(@FindString);

SELECT SUBSTRING(@PrintData, 
                 CHARINDEX(@FindString, @PrintData) + @LenFindString, 
                 CHARINDEX('</Line', @PrintData, CHARINDEX(@FindString, @PrintData)) - (CHARINDEX(@FindString, @PrintData) + @LenFindString)
                 );
1 голос
/ 04 апреля 2019
DECLARE @z NVARCHAR(MAX) = '
    <Line28>.TVR: 4000008000</Line28>
    <Line29>.IAD: 06020103649D00</Line29>
    <Line30>.TSI: E800</Line30>
    <Line31>.ARC: 00</Line31>
    <Line32>.CVM: PIN VERIFIED</Line32>
    <Line33>.TRAN ID: 000000000075169</Line33>
    '

    SELECT SUBSTRING(@z, CHARINDEX('TRAN ID: ', @z) + 9 -- offset charindex by 9 characters to omit the 'TRAN ID: '
                       , CHARINDEX('</Li', @z, CHARINDEX('TRAN ID: ', @z))-CHARINDEX('TRAN ID: ', @z) - 9) -- find the </Li AFTER the occurence of TRAN ID, and subract 9 to account for the offset

Выход 000000000075169.

0 голосов
/ 04 апреля 2019

Я бы просто использовал APPLY:

select @PrintData AS Original_string, 
       substring(tran_id, 1, charindex('</', tran_id) -1) as Tran_ID
from ( values ( substring(PrintData, charindex('TRAN ID:', PrintData) + 8, len(PrintData)) )
     ) t(tran_id);    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...