2010-11-30 122 views
1

我目前正在进行查询以搜索特定的表。要求说我需要抓取所有记录中的任何一组字段是like的输入值。因此,我有一个类似于SQL搜索查询

的查询
SELECT * FROM MyTable 
WHERE Col1 like @input 
    or Col2 like @input 
    or Col3 like @input 

where子句中可能有任意数量的列。一个特定的客户将有50列。因此,这个条款将会相当昂贵。

是否有另一种语法或方法可以使用,以便我可以说“输入值是否存在于任何x列中?”

你会不同地写查询吗?

+0

什么数据库平台? MS SQL服务器,MySql,别的东西? – JohnFx 2010-11-30 20:41:19

+0

我们正在使用MSSQL – 2010-11-30 20:43:15

回答

3

取决于允许使用哪个通配符和哪些通配符,这些查询的确可能会很昂贵,因为优化程序在使用其中的许多索引来加速它们时会遇到困难。

如果您在MS SQL Server上运行此功能,则可以考虑使用全文搜索功能和CONTAINS关键字来实现此功能。

SELECT * 
FROM MyTable 
WHERE CONTAINS 
((col1,col2,col3) ,@input) 

或者搜索所有的文本索引列

SELECT * 
FROM MyTable 
WHERE CONTAINS 
(* ,@input) 
1

我会构造不同的数据。这50列的类型会不会一样?既然你使用“like”,我会假设他们都是varchar列。为什么不能有3个表,'MyTable',一个包含字符串数据的表(不管它是什么),以及一个包含两个引用的连接表。

在这一点上,您的查询就会变成:

select mt.* 
from MyTable mt 
    inner join JoinTable jt 
     on jt.MyTableId = mt.Id 
    inner join DataTable dt 
     on dt.Id = jt.DataTableId 
where dt.Data like @Input 

显然,在如此,我们看到很多是简单地说,答案的“你的数据结构错重做吧。”这并不总是最有帮助的。如果由于某种原因(数据库结构的官僚作风,对这种结构的传统依赖关系等)你不能重构它,你需要意识到你正在旋转这些列。在这一点上,你需要看看这个选项,这将根据这个数据库的分析/事务(读/写)的方式而有所不同。如果你阅读起来很沉重,你可以将数据复制到每次更新'MyTable'时更新的数据透视表中。如果你更具事务性,一个函数或视图至少会抽象出这个枢轴结构,但是查询会很昂贵。 MS SQL全文搜索功能的工作方式与复制数据和插入更新类似,取决于“类似”查询的性质,读取速度可能更快。

0

如果您不需要实时数据,你可以选择一个数据仓库中的情景。

  • 每天,删除并重新加载仅含有一个ID和值列
  • 使用SELECT到表等
SELECT ID, Col1 FROM MyTable 
    UNION ALL SELECT ID, Col2 FROM MyTable 
    UNION ALL SELECT ID, Col3 FROM MyTable 
  • 指数从前面表回来,从左到右,...

这使您可以简化您的原始选择和您使用性能保持看齐

SELECT mt.* 
FROM MyTable mt 
     INNER JOIN MyDWTable mdwt ON mdwt.ID = mt.ID 
WHERE mdwt.Value LIKE @Input