Sql 在内部联接的一部分中使用LIKE子句

Sql 在内部联接的一部分中使用LIKE子句,sql,sql-server,design-patterns,Sql,Sql Server,Design Patterns,在构建存储过程/查询时,是否可以/是否应该使用LIKE条件作为内部联接的一部分?我不确定我问的是对的,所以让我解释一下 我正在创建一个过程,该过程将在包含文本的列中获取要搜索的关键字列表。如果我坐在控制台上,我会这样执行它: SELECT Id, Name, Description FROM dbo.Card WHERE Description LIKE '%warrior%' OR Description LIKE '%fiend%' OR

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

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

SELECT Id, Name, Description
  FROM dbo.Card
 WHERE Description LIKE '%warrior%' 
       OR
       Description LIKE '%fiend%' 
       OR 
       Description LIKE '%damage%'
但我在存储过程中进行“强类型”列表解析时学会了一个技巧,就是将列表解析为表变量/临时表,将其转换为正确的类型,然后在最终结果集中对该表进行内部联接。这在向过程发送(比如)整数ID列表时非常有效。我最终得到了一个如下所示的最终查询:

SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId
SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%'
我想在字符串列表中使用这个技巧。但是因为我在寻找一个特定的关键字,所以我将使用LIKE子句。因此,理想情况下,我认为我的最终查询如下所示:

SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId
SELECT Id, Name, Description
  FROM dbo.Card
       INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%'
这是否可行/推荐

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


我之所以在这个子句的两端加上通配符,是因为卡片文本中使用了“大恶魔”、“野兽战士”、“直接伤害”和“战斗伤害”等术语

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


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

您似乎在寻找全文搜索。因为你想根据卡片描述查询一组关键字并找到任何点击?对吗?

就我个人而言,我以前做过,而且效果很好。我能看到的唯一问题可能是未索引列的问题,但我认为where子句也会有同样的问题


我给你的建议就是看看这两者之间的执行计划。我确信,与所有好的编程问题一样,哪一个更好取决于不同的情况。性能将取决于实际使用的服务器、数据模式和数据量。对于当前版本的MS SQL Server,该查询应该可以正常运行(MS SQL Server 7.0在该语法方面存在问题,但是)


您是否已通过探查器运行该代码?如果性能足够快,并且数据具有适当的索引,则应设置所有索引。

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


如果您正在使用SQL Server,请尝试全文搜索,或者查看其中一个实现。Joel最近谈到了他的成功。

像“恶魔%”这样的人永远不会使用seek,就像“恶魔%”那样。简单的通配符搜索是不可搜索的

@Dillie-O
这张桌子有多大?
描述字段的数据类型是什么

如果两者中的任何一个都很小,那么全文搜索就太过分了

@迪利-O
也许不是你想要的答案,但我主张改变模式

提议的模式:

create table name(
    nameID identity / int
   ,name varchar(50))

create table description(
    descID identity / int
   ,desc varchar(50)) --something reasonable and to make the most of it alwase lower case your values

create table nameDescJunc(
    nameID  int
    ,descID int)
这将允许您使用索引,而无需实现插接解决方案,并保持数据原子化

相关的:

一个小把戏我学了一会儿就走了 在中执行“强类型”列表解析 存储过程用于解析 将列表放入表变量/临时 桌子

我认为您可能在这里暗示的是将要包含的关键字放入一个表中,然后用于查找匹配项(也可以使用另一个表来排除单词)。有关SQL中的工作示例,请参见。

试试这个

SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + 
                                CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%'
试试这个

    select * from Table_1 a
    left join Table_2 b on b.type LIKE '%' + a.type + '%'
这种做法并不理想。小心使用。

试试看

select * from table11 a inner join  table2 b on b.id like (select '%'+a.id+'%') where a.city='abc'.

它对我有用。:-

我认为这应该是
CONCAT(“%”,a.type,“%”)