【问题标题】:How can I Select all rows where column contain any words of a string如何选择列包含字符串的任何单词的所有行
【发布时间】:2012-05-09 18:53:24
【问题描述】:

我从问这个问题开始I wish to Select all rows which contain any element from an array 虽然我当前的问题几乎相同,但它的目的却完全不同,所以我担心答案可能会有所不同,这会掩盖前一个问题。

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

,我似乎无法弄清楚如何做到这一点
select * from table

然后在c#中排序

【问题讨论】:

  • 要获得任何可以称为“搜索引擎”功能(和性能)的东西,您需要使用 Microsoft 全文搜索或 Lucene 之类的东西。 TSQL LIKE 语句的性能会很差(尤其是有多个搜索词时)。
  • 所以我最好开始研究微软全文搜索
  • @K'Leg 或者以不同的方式构建数据,因此您不必使用 LIKE。这在你的情况下是否真的可行是另一回事......
  • Lucene.Netsome info 了解如何开发自己的搜索引擎
  • @BrankoDimitrijevic 你能解释一下我如何以不同的方式构建我的数据。

标签: c# sql sql-server


【解决方案1】:

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 + '%'

【讨论】:

  • 你能不能在这里给我一个完整的查询,我从来没有使用过临时表。
  • @K'Leg 这是完整的查询,您需要将要在表列中搜索的表中的单词推入查询 table_data 是您的表的名称,并使用名称记录名称列
  • 这只是你让我失望的第一行。我希望这会为我创建一个诱惑,但它没有,所以我收到错误必须声明表变量“@SearchWords”
  • @K'Leg - 抱歉忘记了,但它现在更新了,这对你有用
  • 这将搜索所有子字符串,而不仅仅是单词。 @K'Leg 这就是你想要的吗?
【解决方案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”等单词)

【讨论】:

  • 我得到了 like % 的东西,但是如果他们在文本框中输入 15 个单词怎么办,我的查询中就必须有那么多 or 语句,这是可能的,只是很麻烦。
  • 您可以通过在空间上拆分输入字符串然后循环遍历结果来构建查询。或者您可以运行 15 次查询并合并结果。
  • 我倾向于运行它 15 次(不管有多少单词)并合并,这似乎真的很低效。到目前为止,我认为通过循环构建查询是要走的路。似乎总是有一种比我想象的更优雅的做事方式
  • 我刚刚在答案中添加了一些可能有帮助的代码。不过请注意转义这些字符串。
  • 谢谢你,到目前为止,这是我可以使用的唯一可行的答案,但对于未来的观众,我想你至少想删除标点符号 .,?()
猜你喜欢
  • 1970-01-01
  • 2022-09-23
  • 2014-07-04
  • 1970-01-01
  • 2016-02-24
  • 2015-02-06
  • 2021-02-01
  • 1970-01-01
  • 2019-09-19
相关资源
最近更新 更多