2

考虑下表:

人们

  • 名字 nvarchar(50)
  • 姓氏 nvarchar(50)

让我们暂时假设该表对两列都有全文索引。

假设我想在这张表中找到所有名为“John Smith”的人。以下查询似乎是完成此任务的一种非常合理的方式:

SELECT * from People p
INNER JOIN CONTAINSTABLE(People,*,'"John*" AND "Smith*"')

不幸的是,这将不会返回任何结果,假设People表中没有记录在FirstName 或 LastName 列中同时包含“John”和“Smith”。它不会匹配 FirstName 列中的“John”和 LastName 列中的“Smith”的记录,反之亦然。

我的问题是:如何完成我上面想做的事情?请考虑上面的例子是简化的。我正在使用的真实表有十列,我收到的输入是一个单独的字符串,它根据标准分词器(空格、破折号等)

4

2 回答 2

0

http://www.developmentnow.com/g/104_2003_8_0_0_399144/Fulltext-across-multiple-columns.htm

于 2010-03-12T14:36:25.647 回答
0

这就是我最终做的事情:

我上面给出的例子可能有点过于简单了。在实际应用中,全文索引实际上是在一个表示两个表连接的视图上。这样做的一个优点是视图的模式可以独立于构建它的表。

要使用上面的(简化)示例,我有一个如下所示的表:

人们

  • 名字 nvarchar(50)
  • 姓氏 nvarchar(50)

实际构建索引的视图如下所示:

人物视图

  • 名字 nvarchar(50)
  • 姓氏 nvarchar(50)

为了解决这个问题,我修改了视图的架构,以便现在有一个(加上一个键)列,其中包含视图表示的整个表的内容:

人物视图

  • 姓名(名字 + ' ' + 姓氏)

当然,考虑到视图的新模式,全文目录必须重新构建,但所有更改都是在数据库级别进行的,这意味着不会更改应用程序代码。我不得不对视图进行一些调整以处理可能具有空值的列,因为 NULL 与任何东西 = NULL 连接。

于 2010-05-06T21:50:11.927 回答