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

Мне нужно создать столбец формулы. В этом столбце мне нужно вернуть числовое значение.

Пример:

В database.dbo.table1 есть столбец с названием "message", содержащий длинное сообщение.

Сообщение отформатировано так: various words, characters, spaces <this document is> document# = 12345 <this document is>

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

2 ответа

Решение

Использование функций / методов SQLXML XQuery (например, doc.value() обычно обходится дорого, и по возможности его следует избегать. В этом случае на основе предоставленной информации вы можете получить то, что вам нужно, используя CHARINDEX.

Если вы работаете с полем (n)varchar, вы можете сделать это:

declare @mytab table (doc varchar(max))    
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>');

SELECT SUBSTRING(ci,1,CHARINDEX('"',ci)-1)
FROM (SELECT SUBSTRING(doc, CHARINDEX('DocumentID="',doc)+12,20) FROM @mytab) start(ci);

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

declare @mytab table (doc xml); 
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>');

SELECT SUBSTRING(ci,1,CHARINDEX('"',ci)-1)
FROM 
(
  SELECT SUBSTRING
    (
      CAST(doc AS varchar(max)), 
      CHARINDEX('DocumentID="', CAST(doc AS varchar(max)))+12,
      20
    )
  FROM @mytab
) start(ci);
declare @mytab table (doc xml)    
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>')

select      doc.value('(//@DocumentID)[1]','int')
from        @mytab

Если он не сохранен как XML, но как VARCHAR

declare @mytab table (doc varchar(max))    
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>')

select      cast (doc as xml).value('(//@DocumentID)[1]','int')
from        @mytab
Другие вопросы по тегам