从每个有空格的单词中搜索包含少量字符的产品名称

时间:2016-07-01 11:04:50

标签: sql sql-server sql-server-2008 tsql

需要一些以下要求的帮助。将通过一个例子解释

产品名称:" AMOXICILLIN SUSP 250MG / 5ML 100ML "

客户要求就是他们搜索产品时

a)" amoxi "或" amo susp "或" amox susp "或" amo sus 250 100 "
b) 100 250 sus amo amox susp

我们需要显示所有类似的产品名称,例如" amoxilin 10mg"或者" amoxilin 30mg"。基本上,如果产品名称太长,他将使用同一产品中不同单词中的少数字符搜索单词。有时甚至反向也应该像b点中提到的那样工作。寻找实现这一目标的投入。

谢谢。 Prathap。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

尝试这样的事情:

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