2012-05-09 36 views
1

我开始提问这个问题I wish to Select all rows which contain any element from an array 虽然我目前的问题几乎完全相同,但它有着完全不同的目的,所以我担心答案可能会不同这将掩盖前一个,就是这样说的。如何选择列中包含任何字符串的所有行

我正在研究搜索引擎类型的东西。我需要搜索存储在数据库中的标题以查看它是否包含搜索文本框中的任何单词。然后,我计划遍历每一行,计算匹配的单词数量并相应地对结果进行排名。我相信现在已经做了很多次了。我似乎无法弄清楚如何做到这一点不

select * from table 

然后在C#中排序它

+4

得到任何东西可以被称为“搜索引擎”的功能(和性能),你会需要使用诸如Microsoft全文搜索或Lucene之类的东西。 TSQL'LIKE'语句的性能会很差(尤其是对于多个搜索条件)。 –

+0

所以我最好开始寻找微软全文搜索 –

+0

@ K'Leg或者你的数据结构不同,所以你不必使用LIKE。在你的情况下,这是否会实际是另一回事... –

回答

2

你可以尝试这样的事:

SELECT * FROM table WHERE name LIKE '%word1%' OR name LIKE '%word2%'; 

%标志是类似到典型搜索中的*

采取的字符串,并创建此查询多个单词,你可以做这样的事情:

String inputString = "hello my friend"; 
String[] wordlist = inputString.split(" "); 
String query = "SELECT * FROM table WHERE 0=0 "; 
for(String word : wordlist) { 
    query += "OR name LIKE '%" + word + "%' "; 
} 

在字符串末尾的空间是很重要的,不要忘了那些!此外,你可能会希望在分割之前对字符串进行清理(删除额外的标点符号,甚至可能删除诸如“a”或“the”或“to”之类的字词等)。

+0

我得到了类似%的东西,但如果他们在文本框中输入15个单词,我将不得不在我的查询中包含那么多或者语句,这将是可能的,只是很麻烦。 –

+0

您可以通过在空间上拆分输入字符串然后遍历结果来构建查询。或者你可以运行查询15次并合并结果。 – ametren

+0

我倾向于运行15次(无论有多少单词)和合并,这看起来效率很低。我认为到目前为止,通过循环构建查询是一条路。看起来总有一种比我想象的更优雅的做事方式 –

4

sql server中的一种方法是

推词在临时表这样

DECLARE @SearchWords TABLE (
    word varchar(30)) 

INSERT INTO @SearchWords 
     (word) 
VALUES ('Jack') 
     ,('Pontiac') 
     ,('Bloggs'); 

比加入这个表格与实际表格

SELECT a.* FROM table_data a 
INNER JOIN @SearchWords b on a.record_desc like '%' + b.word + '%' 
+0

你能给我一个完整的查询吗?我从来没有使用临时表。 –

+0

@ K'Leg这是完整的查询你必须推表中的单词,你想在你的表中搜索表中的字在这里查询table_data是你的名字和claumng名称record_desc与列的名称 –

+0

它只是第一个你失去了我。我希望这会为我创建一个临时表,但它并不是我得到的错误必须声明表变量“@SearchWords” –

相关问题