是否可以使用ContainsTable获取多个列的结果?

时间:2010-02-11 17:34:07

标签: sql sql-server tsql full-text-search containstable

考虑下表:

  • FirstName nvarchar(50)
  • LastName nvarchar(50)

我们暂时假设这个表的两列都有一个全文索引。

我们假设我想在这张桌子中找到所有名为“John Smith”的人。以下查询似乎是完成此任务的完美理性方法:

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

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

我的问题是:如何实现我上面要做的事情?请考虑简化上面的示例。我正在使用的真实表有十列,我收到的输入是一个单独的字符串,它根据标准断字符(空格,短划线等)分开。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

这是我最终做的事情:

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

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

<强>人

  • FirstName nvarchar(50)
  • LastName nvarchar(50)

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

<强> PeopleView

  • FirstName nvarchar(50)
  • LastName nvarchar(50)

要解决这个问题,我修改了视图的模式,以便现在有一个(加一个键)列,其中包含视图所代表的整个表的内容:

<强> PeopleView

  • 名称(FirstName +''+ LastName)

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