是否有可能使用ContainsTable获取多个列的结果?
问题描述:
考虑下表:是否有可能使用ContainsTable获取多个列的结果?
人民
- 名字为nvarchar(50)
- 姓氏为nvarchar(50)
假设为这个表有一个完整的时刻这两列的文字索引。
假设我想在此表中找到所有名为“John Smith”的人。下面的查询似乎是一个完全理性的方式来实现这一目标:
SELECT * from People p
INNER JOIN CONTAINSTABLE(People,*,'"John*" AND "Smith*"')
不幸的是,这将不返回任何结果,假设有在人们没有记录表中同时包含“约翰”和“史密斯”在FirstName或LastName列中。它不会与FirstName列中的“John”和LastName列中的“Smith”匹配,反之亦然。
我的问题是这样的:一个人如何完成我想要做的以上?请考虑上面的例子是简化的。我正在使用的真实表格有十列,我收到的输入是基于标准断字符(空格,短划线等)拆分的单个字符串
答
这里是我落得这样做:
我上面给的例子可能是一个过于简单。在实际的应用程序中,全文索引实际上是一个表示两个表的连接的视图。这样做的一个优点是视图的模式可以独立于其构建的表。
要使用从我上面的(简化)的例子,我有一个表,看起来像这样:
人民
- 名字为nvarchar(50)
- 姓氏为nvarchar(50)
该索引实际构建的视图如下所示:
PeopleView
- 姓为nvarchar(50)
- 名字为nvarchar(50)
要解决的问题,我修改视图的架构使得现在有单个(加一个关键字)列,其中包含整个表格的内容所代表的视图:
PeopleView
- 名称(名字+“” +姓氏)
的全文目录必须重建,当然,考虑到视图的新模式,但所有的变化是在数据库级别进行的,这意味着应用程序代码不会发生变化。我必须对视图进行一些调整,以处理可能具有空值的列,因为NULL与任何= NULL连接。
这很有趣,和我在搜索时发现的其他一些解决方案类似。不幸的是,这需要对我的应用程序进行重大改写,我认为性能会受到一定影响。 – LockeCJ 2010-05-06 21:05:43