2015-03-19 5 views
0

Одно из полей в моих результатах, содержит следующие «стандартные» ноты:Извлечение из двух частей струны

Audit Status changed from STOP to RELEASED. 
Audit Status changed from STOP to RFS Pend. 
Audit Status changed from RELEASED to RFS Pend. 
Audit Status changed from STOP to ODY Pend. 
Audit Status changed from ODY Pend to RELEASED. 

Там могут быть и другие ноты, но это те, которые я видел до сих пор.

Что бы я хотел сделать, это извлечь 2 части каждой заметки с выражением.

Первая часть - это слова между from и to (STOP, RELEASED, ODY Pend, etc.).

Вторая часть слова после to (RELEASED, RFS Pend, ODY, etc.)

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

+1

какой SQL Server вы используете? Если вы используете MySQL, посмотрите на это: http://dev.mysql.com/doc/refman/5.1/en/regexp.html –

+0

Если вы используете SQL Server, вы можете использовать PATINDEX и SUBSTRING для этого. –

+0

Спасибо за отзыв. Если у вас есть примеры PATINDEX и SUBSTRING, я бы хотел их увидеть. спасибо за помощь – Shaves

ответ

0

Это должно быть сделано с помощью MS SQL Server.

CREATE TABLE MyTable (col1 int IDENTITY(1,1), col2 varchar(50)); 

INSERT MyTable (col2) VALUES ('Audit Status changed from STOP to RELEASED.'); 
INSERT MyTable (col2) VALUES ('Audit Status changed from STOP to RFS Pend.'); 
INSERT MyTable (col2) VALUES ('Audit Status changed from RELEASED to RFS Pend.'); 
INSERT MyTable (col2) VALUES ('Audit Status changed from STOP to ODY Pend.'); 
INSERT MyTable (col2) VALUES ('Audit Status changed from ODY Pend to RELEASED.'); 

И ...

WITH MyData AS 
(
    SELECT col1, 
    col2, 
    PATINDEX('% from %', col2) + 6 as Start1, 
    PATINDEX('% to %', col2) as Stop1, 
    PATINDEX('%.', col2) as Stop2 
    FROM MyTable 
) 
SELECT SUBSTRING(col2, Start1, Stop1-Start1) as Word1, 
     SUBSTRING(col2, Stop1+4, Stop2-Stop1-4) as Word2 
FROM MyData 

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

ПРИМЕЧАНИЕ: Это приведет к разрушению, если шаблоны ('от', 'до' или '.') Встречаются более одного раза в ваших строках. И вы захотите включить некоторую обработку ошибок или, возможно, предложение where, чтобы отфильтровать значения нуля (когда шаблон не найден), что приведет к отрицательной длине.

Смежные вопросы