Sql 在内部联接的一部分中使用LIKE子句
在构建存储过程/查询时,是否可以/是否应该使用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
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,“%”)