代码之家  ›  专栏  ›  技术社区  ›  LockeCJ

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

  •  2
  • LockeCJ  · 技术社区  · 16 年前

    考虑下表:

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

    现在我们假设这个表上有两列的全文索引。

    假设我想在这张桌子上找到所有叫“约翰·史密斯”的人。以下查询似乎是实现此目的的一种完全合理的方法:

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

    不幸的是,如果在 在firstname或lastname列中同时包含“john”和“smith”的表。它将与firstname列中的“john”和firstname列中的“smith”不匹配,反之亦然。

    我的问题是:一个人如何完成我在上面试图做的事情?请考虑简化上述示例。我正在处理的实际表有十列,我接收的输入是一个字符串,它根据标准分词符(空格、短划线等)进行拆分。

    2 回复  |  直到 16 年前
        2
  •  0
  •   LockeCJ    16 年前

    我最后做的是:

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

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

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

    该索引实际上是基于以下视图构建的:

    人见

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

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

    人见

    • 姓名(firstname+“”+lastname)

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