SQL查询 - 跨多个字段搜索

时间:2009-03-12 08:45:02

标签: sql-server sql-server-2005

我正在尝试实施搜索,您可以在其中输入多个搜索项以形成AND条件。它还应搜索数据库的不同字段。

所以例如:
当您输入“Bill Seattle”时,您应该获得 NAME 匹配 Bill CITY 匹配<的记录EM>西雅图。只有 CITY 匹配西雅图,您才能获得任何行。

现在,这听起来并不复杂,但它似乎比我想象的要难。我想出了类似的东西:

SELECT * FROM ADDRESS WHERE
((NAME LIKE 'Bill%') OR (NAME LIKE 'Seattle%')) 
AND
((CITY LIKE 'Bill%') OR (CITY LIKE 'Seattle%'))

这在我们之前的案例中运作良好,但假设我们添加了另一个字段:

SELECT * FROM ADDRESS WHERE
((NAME LIKE 'Bill%') OR (NAME LIKE 'Seattle%')) 
AND
((CITY LIKE 'Bill%') OR (CITY LIKE 'Seattle%'))
AND
((COMPANY LIKE 'Bill%') OR (COMPANY LIKE 'Seattle%'))

现在它不会返回所需的结果。 我本质上需要(我猜)是一种确定是否像

这样的子条件的方法
 ((COMPANY LIKE 'Bill%') OR (COMPANY LIKE 'Seattle%'))

返回一些东西,如果没有,我需要忽略那个条件。

是的,我正在使用MSSQL '05。

3 个答案:

答案 0 :(得分:12)

首先,我不知道它是如何在MSSQL上完成的,但您可能希望查看全文搜索。

另一方面,这可能是你的意思:

SELECT * FROM ADDRESS WHERE
((NAME LIKE 'Bill%') OR (CITY LIKE 'Bill%') OR (COMPANY LIKE 'Bill%'))
AND
((NAME LIKE 'Seattle%') OR (CITY LIKE 'Seattle%') OR (COMPANY LIKE 'Seattle%'))

答案 1 :(得分:4)

全文索引允许您同时使用Contains和Conatainstable,这对于您需要的情况非常强大。

答案 2 :(得分:0)

如果你想做得很好,那将非常困难。在理想的世界中,您的程序可以查看每个关键字并确定其含义,从而确定它应匹配的列。但这需要一些聪明才智 - 自然语言识别。

您搜索“Bill Seattle”的示例需要程序将“Bill”标识为人名的一部分,并将“Seattle”标识为城市名称。一个简单的方法是建立所有已知城市的列表并在那里查找关键字,如果找到则将其标记为城市名称。您可以为公司做同样的事情,然后将所有既不像城市也不像公司的关键字视为部分人名。使用此分类构建SQL查询应该很容易。

但我非常有信心,像我上面描述的简单过程将是脆弱的。因此,除非您使用一些更智能的解析解决方案(从OpenCalais项目中查看the example parser的想法),我建议采用简单的方法:

如上所述,简单的方法是对表格的所有文本字段进行全文搜索,并按排名排序结果 - 这可能是一个很好的80-20解决方案。