Есть ли способ найти и извлечь строку, состоящую из 2 символов, за которыми следует любое 8-значное число в SQL Server? - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь создать запрос для извлечения десятизначной строки из большей строки. Эта строка будет состоять из двух символов, за которыми следуют 8 цифр, например, 'EL12345678'

. Ранее я использовал следующий запрос, где переменная @prefix может состоять из любых двух символов. Однако я сталкивался с некоторыми случаями, когда эти символы используются в других местах строки, заставляя ее извлекать неправильный код.

SELECT SUBSTRING(message_key, (SELECT CHARINDEX(@prefix, message_key)), 10) AS pcn,
       Message_ID
FROM MQ
WHERE Message_Status != 'processed'
  AND Message_Status != 'bad'
  AND message_status != 'new'
  AND Message_Time > DATEADD(DAY, -@days, dbo.dateonlyVB())
  AND Message_MethodName = CASE WHEN @prefix = 'DN' THEN 'SaveJob' ELSE 'savedetails' END;

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

Я ожидаю, что он сможет извлечь строку типа «EL12345678» из строки большего размера, которая может быть где угоднов области более 300 символов. Однако мой запрос в настоящее время иногда извлекает строки типа 'elValvef': 'вместо этого.

Любая помощь с этим вообще будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

ОБНОВЛЕНО НА ОСНОВЕ OP-КОММЕНТАРИЙ

Как показал Гордон, вы можете сделать это:

SELECT item = SUBSTRING(@string,PATINDEX('%'+@prefix+'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', @string),8)

Вы также можете использовать NGrams8k длятакие вещи:

DECLARE @string VARCHAR(1000) = 'ABCXXXAB12345678 blah blah', @prefix VARCHAR(2) = 'AB';

SELECT item = ng.token
FROM   dbo.NGrams8k(@string,10) AS ng
WHERE  PATINDEX('%'+@prefix+'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',ng.token) = 1;

СТАРЫЙ:

This string would consist of two characters followed by 8 digits
e.g.'EL12345678'

Если это так просто, вы можете просто сделать это:

DECLARE @string VARCHAR(1000) = 'EL12345678';

SELECT SUBSTRING(@string,3,8)

--Returns: 12345678
0 голосов
/ 08 ноября 2019

Использование можно использовать patindex():

select substring(largerstring,
                 patindex('%__[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', largerstring
                         ), 10
                )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...