2009-12-03 32 views
0

我有以下查詢,我在XMLData類型列中搜索。SQL - 根據搜索模式輸出一個子字符串,確保首字符/最後一個字符串是全字

我想返回一個節點的子串,該節點或者以搜索條件開始,然後X個字符,然後以完整的單詞或一個子字符串結尾,該搜索條件將搜索條件放在結果的中間,幷包含X個字符開始/結束之前和之後的新單詞。

這兩個概念的原因是,搜索標準可能在節點的開始處,因此X之後的字符數或深度在文本中顯示字符之前/之後。

我的查詢似乎是以一個新單詞開始的,但我不能以此結束,我有一個反轉字符串,對它做一個patindex,然後做長度的搜索 - patindex,但似乎沒有上班。

感謝

SELECT 
P.Title, 
SUBSTRING(DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)'),PATINDEX('%north%',DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)')) - 20 + PATINDEX('% %',SUBSTRING(DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)'),PATINDEX('%north%',DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)')) - 20,999)),999) AS Data 

FROM WEBPAGECONTENT W 

INNER JOIN WebPage P 
ON P.ID = W.PageID 

WHERE COALESCE(PATINDEX('%north%',DATA.value('(/PageContent/Text)[1]', 'VARCHAR(100)')),0) > 0 

回答

0

給這個一展身手。我已經用簡單的變量替換了你的XML查詢,但是聲明的基本佈局保持不變。儘管如此,這還有點不利。另外,根據您的數據和要求,您可能需要更改單個空間的搜索以包含其他字符,如'。'。和','作爲單詞的潛在目的。

雖然我想解釋代碼的每一位,這是過去我的午餐時間,所以我會離開,作爲一個練習留給讀者;)

DECLARE 
@search_string VARCHAR(20), 
@string VARCHAR(1000) 

SET @string = 'This is a test north this is only a test' 
SET @search_string = 'north' 

SELECT 
SUBSTRING(@string, 
CASE 
    WHEN PATINDEX('%' + @search_string + '%', @string) <= 20 THEN 1 
    WHEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) - 20, 20)) <> 0 
    THEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) - 20, 20)) 
    ELSE PATINDEX('%' + @search_string + '%', @string) 
END, 
CASE 
    WHEN PATINDEX('%' + @search_string + '%', @string) + LEN(@search_string) >= LEN(@string) - 20 THEN 1000 
    WHEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) + LEN(@search_string), 20)) <> 0 
    THEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) + LEN(@search_string), 20)) 
    ELSE 0 
END + LEN(@search_string) + 
(PATINDEX('%' + @search_string + '%', @string) - CASE 
    WHEN PATINDEX('%' + @search_string + '%', @string) <= 20 THEN 1 
    WHEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) - 20, 20)) <> 0 
    THEN PATINDEX('% %', SUBSTRING(@string, PATINDEX('%' + @search_string + '%', @string) - 20, 20)) 
    ELSE PATINDEX('%' + @search_string + '%', @string) 
END) 
) 
相關問題