Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-多列子字符串匹配_Sql_Sql Server 2005_Sql Server 2008_Search - Fatal编程技术网

SQL Server-多列子字符串匹配

SQL Server-多列子字符串匹配,sql,sql-server-2005,sql-server-2008,search,Sql,Sql Server 2005,Sql Server 2008,Search,我的一个客户对多列子字符串匹配很感兴趣 我理解这一点,并搜索单词,至少在包含单词前缀的情况下。然而,根据我对MSDN书的理解,无论是这些还是它们的变体都不能搜索子字符串 我使用了相当广泛的Select*,其中A.B如“%substr%” 样本表A: ID | Col1 | Col2 | Col3 | ------------------------------------- 1 | oklahoma | colorado | Utah | 2 | arkans

我的一个客户对多列子字符串匹配很感兴趣

我理解这一点,并搜索单词,至少在包含单词前缀的情况下。然而,根据我对MSDN书的理解,无论是这些还是它们的变体都不能搜索子字符串

我使用了相当广泛的Select*,其中A.B如“%substr%”

样本表A:

ID | Col1     | Col2     | Col3     |
-------------------------------------
1  | oklahoma | colorado | Utah     |
2  | arkansas | colorado | oklahoma |
3  | florida  | michigan | florida  |
-------------------------------------
以下代码将为我们提供第1行和第2行:

 select * from A where Col1 like '%klah%' or Col2 like '%klah%' or Col3 like '%klah%'
这很难看,可能很慢,我只是不太喜欢。可能是因为我正在处理的实现有10多列需要搜索

随着代码可读性的提高,下面的代码可能会略有改进,但就性能而言,我们仍然处于相同的水平

 select * from A where (Col1 + ' ' + Col2 + ' ' + Col3) like '%klah%'
我曾经考虑过简单地添加insert、update和delete触发器,这些触发器只需将上述列的连接版本添加到一个单独的表中,该表就会隐藏在该表的阴影中

阴影表示例:

ID | searchtext                 |
---------------------------------
1  | oklahoma colorado Utah     |
2  | arkansas colorado oklahoma |
3  | florida michigan florida   |
---------------------------------
这将允许我们执行以下查询来搜索“%klah%”

select * from Shadow_Table where searchtext like '%klah%'
我真的不想记住这个影子表是存在的,我应该在执行多列子字符串匹配时使用它,但它可能会以写和存储空间为代价产生相当快的读取

我的直觉告诉我,SQLServer2008内置了一个现有的解决方案。然而,除了这方面的研究论文,我似乎找不到任何其他东西


任何帮助都将不胜感激。

根据您的描述,您似乎在寻找一种改进精确搜索的方法。当您试图查找与字符串完全匹配的字符串时,LIKE是合适的工具。如果你担心性能,那么你应该考虑索引,甚至像你所描述的自定义索引。

可以考虑一个持久化的计算列而不是影子表。插入/更新的开销应该小于使用触发器,并且查询时间可能相当

论全文检索

全文搜索设计为自然语言搜索

从最终用户的角度考虑。如果我在寻找俄克拉何马州,我可能会从俄克拉何马州或俄克拉何马州开始。我不会去找荷马。这是我们人类思维的方式。因此,自然语言搜索


自然语言搜索使用词根和相似的词来增加搜索结果的总数。但是,如果您希望所有结果都与您的搜索词特别匹配,则这不是最佳选择:例如,自由文本将“我驾驶到我的课程”与“驾驶”和“课程”匹配,即使两个词都没有特别出现

查看我的全文搜索。上面链接的MSDN书籍表明,全文搜索是一种基于单词的搜索,它还能够使用同义词库匹配与搜索词相近的单词或具有相同含义的单词。我的解释有误吗?我认为在这里使用持久化计算列比使用阴影表要优雅得多。事实上,我可以在所有需要这种特定搜索类型的表中为它命名一致的名称。另外,感谢您对全文搜索的解释。对于几乎所有面向网络的搜索,我都能看出这是非常有用的。然而,在像我这样的情况下,我们将搜索精确的记录,如姓名和街道名称,因此我更愿意使用子字符串来促进精确搜索。如果速度太慢,我可以求助于全文搜索。谢谢