2016-07-01 42 views
1

需要一些幫助以滿足以下要求。將通過一個例子來解釋搜索產品名稱,其中包含空格的每個單詞中包含幾個字符

產品名稱: 「AMOXICILLIN SUSP 250MG/5ML 100ML

客戶的要求是,當他們搜索的產品像

一) 「amoxi」 或「AMO停賽 「或」 AMOX停賽 「或」 AMO SUS 250 100
b)中100 250 SUS摩AMOX停賽

我們需要顯示像所有類似的產品名稱「amoxilin 10mg的」或「amoxilin爲30mg」。基本上,如果產品名稱是太長了,他會從不同的搜索使用幾個字符的字單詞在同一個產品中。有時甚至反向也應該像b點提到的那樣工作。尋找投入來實現這一目標。

謝謝。 Prathap。

+1

https://msdn.microsoft.com/en-us/library/ms142571.aspx –

+0

你是什麼意思*相關產品*?另一種抗生素或類似的產品名稱? – gofr1

+0

是的其他產品,如「'阿莫西林10mg」或「'阿莫西林30mg」 – user2859242

回答

0

一種方法是將查詢字符串分解爲單個令牌,將每個令牌與數據進行匹配,計算已匹配的令牌數並僅返回與所有令牌匹配的結果。

像這樣:

DECLARE @QueryString NVARCHAR(200) = 'amo susp'; 
WITH data AS (
    SELECT col = 'AMOXICILLIN SUSP 250MG/5ML 100ML' UNION ALL 
    SELECT col = 'Other product' 
), 
QueryTokens AS(
    SELECT Token = X.n.value('.', 'nvarchar(200)') 
    FROM (SELECT CAST('<i>' + REPLACE(@QueryString, ' ', '</i><i>') + '</i>' AS XML)) AS C(n) 
     CROSS APPLY C.n.nodes('i') AS X(n) 
), 
NrOfTokens AS (
    SELECT NrTokens = COUNT(1) 
    FROM QueryTokens 
) 
SELECT D.col 
FROM data AS D 
    CROSS JOIN NrOfTokens AS NT 
    INNER JOIN QueryTokens AS QT 
     ON D.col LIKE QT.Token + '%' 
     OR D.col LIKE '% ' + QT.Token + '%' 
GROUP BY D.col, NT.NrTokens 
HAVING COUNT(1) = NT.NrTokens; 
+0

將嘗試。謝謝 – user2859242

0

嘗試這樣:

SELECT ProductName 
FROM TableName 
WHERE CONTAINS (ProductName, '"AMO*" OR "SUS*" OR "250M*" OR "100*"') 
+0

但是這裏的值在包含查詢中是靜態的。我們可以將其更改爲動態以搜索任何產品名稱 – user2859242

+0

我們如何在存儲過程中爲參數發送參數。 – user2859242

+0

DECLARE @keywords(100) SET @keywords ='「AMO *」或「SUS *」或「250M *」或「100 *」' SELECT ProductName FROM TableName WHERE CONTAINS(ProductName,@keywords); – user2361044

相關問題