Как искать строку и возвращать только числовое значение?
Мне нужно создать столбец формулы. В этом столбце мне нужно вернуть числовое значение.
Пример:
В 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