SQL Join基于模式

时间:2015-01-13 21:01:41

标签: sql join pattern-matching

我有两个表tmpModels和tmp_product。需要在tmpModel中找到基于模型的匹配模型。  例如,如果tmpmodel.updatedmodel ='amb3771'tmp_product.updatedmodel可能是'amb3771bian' or '123abc3771xv',那么我们就匹配了。 这意味着tmp_product.updatedmodel应该在updatedmodel列的任何位置包含来自tmpmodel的匹配模式。

我实际上已创建了一个存储过程,但这里有一个片段,用于检查一个特定值的行为。

declare @model1 nvarchar(255)
set @model1 = 'amb3771'

select g.updatedmodel as GFK,p.updatedmodel Product from dbo.tmpModels g
join dbo.tmp_product p
on g.updatedmodel= substring(p.updatedmodel,PATINDEX('%@model1%',p.updatedmodel),LEN(@model1))

select @model1

我希望结果中只显示两行。我不明白为什么为@model1分配了不同的值,即使我强迫它为'amb3771'而奇怪的是没有结果匹配'amb3771'!!请帮助我理解为什么这个逻辑不起作用并给出所需的结果。以下是结果 -

GFK   Product
w679    w679
t754cw  t754cw
wa5714  wa5714silber
fl2823  fl2823
dc7230  dc7230
wda100  wda100
wa74sd  wa74sd
ev9547  ev9547
wa5714  wa5714weiss
wa7439  wa7439
wda210  wda210wpm
wda210  wda210wpm
w194    w194
wda110  wda110wcs
wa5714  wa5714silber
wda100  wda100

1 个答案:

答案 0 :(得分:1)

首先,DLeh提到@model不应该在引号中。

  

我不明白为什么要为@ model1分配不同的值   即使我强迫它

没有为@model

分配不同的值

如果执行下面的查询,您可以看到PATINDEX返回0,然后substring从第0个索引到其长度获得p.UpdateModel的完整值

select g.updatedmodel as GFK,p.updatedmodel Product, PATINDEX(@model1,p.updatedmodel) 
from dbo.tmpModels g
join dbo.tmp_product p
on g.updatedmodel= substring(p.updatedmodel,PATINDEX(@model1,p.updatedmodel),LEN(@model1))

我建议的一个解决方案是使用WHERE条件而不是JOIN

set @model1 = '%wa5714%'

    select DISTINCT g.updatedmodel as GFK,p.updatedmodel Product
    from dbo.tmpModels g
    , dbo.tmp_product p
    WHERE PATINDEX(@model1,p.updatedmodel) > 0
    AND  PATINDEX(@model1,g.updatedmodel) > 0

我假设你的模型应该显示tmpModel和tmp_Product的值。

如果您有不同的要求,请提供更多详细信息/示例