当前位置:  开发笔记 > 数据库 > 正文

在INNER JOIN的一部分中使用LIKE子句

如何解决《在INNERJOIN的一部分中使用LIKE子句》经验,为你挑选了2个好方法。

在构建存储过程/查询时,是否可以/应该使用LIKE条件作为INNER JOIN的一部分?我不确定我问的是正确的,所以让我解释一下.

我正在创建一个过程,该过程将在包含文本的列中搜索要搜索的关键字列表.如果我坐在控制台,我会这样执行:

SELECT Id, Name, Description
  FROM dbo.Card
 WHERE Description LIKE '%warrior%' 
       OR
       Description LIKE '%fiend%' 
       OR 
       Description LIKE '%damage%'

但是,我在一个存储过程中进行"强类型"列表解析时,我捡到的一个技巧是将列表解析为表变量/临时表,将其转换为正确的类型,然后对该表执行INNER JOIN在我的最终结果集中.当向程序发送整数ID列表时,这很有用.我最终得到一个如下所示的最终查询:

SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId

我想用一个字符串列表来使用这个技巧.但是因为我正在寻找一个特定的关键字,所以我将使用LIKE子句.理想情况下,我认为我的最终查询看起来像这样:

SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%'

这可能/推荐吗?

有没有更好的方法来做这样的事情?


我在条款的两端加上通配符的原因是因为卡片文本中使用了"archfiend","beast-warrior","direct-damage"和"battle-damage"术语.

我的印象是,根据性能,我可以使用我指定的查询,还是使用全文关键字搜索来完成相同的任务?

除了让服务器对我想要文本搜索的字段进行文本索引之外,还有什么我需要做的吗?



1> 小智..:

试试这个

    select * from Table_1 a
    left join Table_2 b on b.type LIKE '%' + a.type + '%'

这种做法并不理想.谨慎使用.


我认为这应该是`CONCAT('%',a.type,'%')`http://stackoverflow.com/a/23276513/443900

2> jason saldo..:

您的第一个查询将起作用,但需要进行全表扫描,因为该列上的任何索引都将被忽略.您还必须执行一些动态SQL来生成所有LIKE子句.

如果您使用SQL Server或检查其中一个Lucene实现,请尝试全文搜索.乔尔最近谈到了他的成功.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有