2014-02-12 40 views
0

我做的模式匹配這樣的:展會成功的圖案,結果

SELECT  ea.Text 
    FROM   dbo.Parameters AS n INNER JOIN 
          dbo.Descriptions AS ea ON ea.Text LIKE '%' + n.par1 + n.par2 + n.Achtervoegsel + '%' OR 
          ea.Text LIKE '%' + n.par1 + '_' + n.par2 + '_' + n.par3 + '%' OR 
          ea.Text LIKE '%' + n.par1 + n.par2 + '_' + n.par3 + '%' OR ea.Text LIKE '%' + n.par1 + '_' + n.par2 + n.par3 + '%' OR 
          ea.Text LIKE '%' + n.par1 + '__' + n.par2 + n.par3 + '%' OR 
          ea.Text LIKE '%' + n.par1 + '__' + n.par2 + '_' + n.par3 + '%' 

好,能正常工作。六種可能的模式正在匹配。 但現在我的問題。

我想添加一個輸出欄,顯示我成功的模式。 例如,如果我的ea.Text是:

這是蘋果2000-A和其他東西

,我的表中的參數長描述與 PAR1「蘋果」 PAR2紀錄'2000' PAR3 'A'

那麼這種模式會給出一個結果:

'%' + n.par1 + '_' + n.par2 + '_' + n.par3 + '%' 

在這種情況下,I W烏爾德喜歡有說

APPLE 2000-A

這是可能的列?

回答

0

如果你知道一個「OR」是不是與工會重新設計查詢,你可以做這樣的事情在幕後:

SELECT ea.Text, n.par1 + n.par2 + n.Achtervoegsel 
FROM dbo.Parameters AS n 
    INNER JOIN dbo.Descriptions AS ea ON ea.Text LIKE '%' + n.par1 + n.par2 + n.Achtervoegsel + '%' 
UNION ALL 
SELECT ea.Text, n.par1 + '_' + n.par2 + '_' + n.par3 
FROM dbo.Parameters AS n 
    INNER JOIN dbo.Descriptions AS ea ON ea.Text LIKE '%' + n.par1 + '_' + n.par2 + '_' + n.par3 + '%' 
UNION ALL 
SELECT ea.Text, n.par1 + n.par2 + '_' + n.par3 
FROM dbo.Parameters AS n 
    INNER JOIN dbo.Descriptions AS ea ON ea.Text LIKE '%' + n.par1 + n.par2 + '_' + n.par3 + '%' 
UNION ALL 
SELECT ea.Text, n.par1 + '_' + n.par2 + n.par3 
FROM dbo.Parameters AS n 
    INNER JOIN dbo.Descriptions AS ea ON ea.Text LIKE '%' + n.par1 + '_' + n.par2 + n.par3 + '%' 
UNION ALL 
SELECT ea.Text, n.par1 + '__' + n.par2 + n.par3 
FROM dbo.Parameters AS n 
    INNER JOIN dbo.Descriptions AS ea ON ea.Text LIKE '%' + n.par1 + '__' + n.par2 + n.par3 + '%' 
UNION ALL 
SELECT ea.Text, n.par1 + '__' + n.par2 + '_' + n.par3 
FROM dbo.Parameters AS n 
    INNER JOIN dbo.Descriptions AS ea ON ea.Text LIKE '%' + n.par1 + '__' + n.par2 + '_' + n.par3 + '%' 

如果你真的想那是對相匹配的精確值(而不是'_'- s)您可能想要查看substring()函數。我不知道有什麼其他解決方案來解決這個問題。

+0

如果你想匹配的值,你可能想看看進入函數substring(),charindex(),patindex()。這些可以幫助你獲得你想要的結果。 – Pieter

0

如果你可以創建一個函數,這樣做的一個很好的方法是在那裏進行匹配,並返回你找到的搜索字符串!然後,您可以輕鬆地返回匹配的字符串作爲列:

的功能

CREATE FUNCTION dbo.MatchingString 
(
    @text nvarchar(100), 
    @par1 nvarchar(100), 
    @par2 nvarchar(100), 
    @par3 nvarchar(100) 
) 
RETURNS nvarchar(100) 
AS 
BEGIN 

    declare @searchString nvarchar(100); 
    declare @currSearchString nvarchar(100); 
    declare @charIndex int = -1; 

    set @currSearchString = Concat(@par1,'_',@par2,'_',@par3); 
    set @charIndex = CharIndex(@searchString,@text,0); 

    if(@charIndex >= 0) begin 
     set @searchString = @currSearchString; 
    end 

    --loop over more searchstrings or do it manually 


    return @searchString; 
END 

查詢

SELECT  ea.Text, 
MatchingString = dbo.MatchingString(ea.Text,n.par1,n.par2,n.par3) 
    FROM   dbo.Parameters AS n INNER JOIN 
     dbo.Descriptions AS ea ON dbo.MatchingString(ea.Text,n.par1,n.par2,n.par3) IS NOT NULL