admin

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

sql

可以/应该在构建存储过程/查询时将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”这两个术语。

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

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


阅读 257

收藏
2021-05-10

共1个答案

admin

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

如果您使用的是SQL
Server,请尝试全文搜索,或者尝试使用Lucene的实现之一。乔尔(Joel)最近谈到了他的成功。

2021-05-10