使用like运算符进行sql搜索查询

时间:2014-09-20 06:31:21

标签: sql sql-server-2008 tsql sql-server-2012 sql-like

我有一个名为infoone的表格,其中包含两列addresslocationCITY

我想写一个搜索查询。

如果用户搜索Edmonton,则应返回包含城市Edmonton的所有记录。

如果用户搜索12 main street Edmonton,则应返回所有相应的记录。 12 main street是地址,Edmonton是城市

我的追问是什么,

string sql = "select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+'...' as des1,LOCATIONCITY,ADDRESS,DateT,RENT from infoone where  ";
    sql += "(((address like '%"+txtSearch.Text+"%')  or (address like '')) and ((locationcity like '%"+txtSearch.Text+"%') or  (locationcity like '')) and ((address LIKE '%"+txtSearch.Text+"%')  or (address like '')))";

当我搜索时,上面的查询没有返回任何内容:

main street Edmonton

用户也可以在没有城市的情况下进行搜索:12th main street

我做错了什么?

请帮忙

由于

3 个答案:

答案 0 :(得分:2)

自由搜索地址非常困难。

让我们看看你的例子

Address         locationCity
12 Main Street  Edmonton
456 Thomas Ave  St Martin

可能的搜索

  • 埃德蒙顿 - 如果只有一个字,我们应该假设它是一个城市吗?如果是这样,怎么样 用户会找到圣马丁吗?
  • 12大街埃德蒙顿 - 现在,你怎么知道埃德蒙顿是这座城市? 用户可以只搜索街道名称吗?

我建议您的界面接受两列,一个用于地址,一个用于城市,这将使搜索更容易。

where  <other conditions>
AND
(locationcity like '%CitySearchFld%' and address like '%AddresssSearchFld%')

无需搜索空,因为如果用户将该字段留空,则搜索%%将匹配所有行

其他注意事项

用户搜索

会发生什么
12 Main St

<强> Edmenton

<强>缩写?拼写错误吗

要处理缩写,我会建立一个停用词列表,它会删除地址栏中的常用缩写,例如St,Street,Avenue,Ave等。所以搜索变为

12 Main

我不想错过任何一张唱片,因为我不确定桌子上是街道还是街道。

您还可以使用一个称为Soundex(本机SQL)或Metaphone(自定义SQL或CLR)的函数来处理拼写错误......

祝你好运

答案 1 :(得分:1)

我不相信你的where子句正在按照你的意图行事。让我们删除外部字符串var并重新格式化以便于阅读:

select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+'...' as des1
,LOCATIONCITY,ADDRESS,DateT,RENT 
from infoone 
where(
    ((address like '%"+txtSearch.Text+"%')  or (address like '')) 
    -- #1 address must match full text or be blank
    and 
    ((locationcity like '%"+txtSearch.Text+"%') or  (locationcity like '')) 
    -- #2 locationcity must match full text or be blank
    and 
    ((address LIKE '%"+txtSearch.Text+"%')  or (address like ''))
    -- #3 address must match full text or be blank. Seems a duplicate of #1
    )

这三个与ANDs链接在一起,因此所有三个条件都必须为true才能返回结果。

至少,Where子句可能会被重写为:

select PLACEID,LEFT(CONVERT(NVARCHAR(1000),description),500)+'...' as des1
,LOCATIONCITY,ADDRESS,DateT,RENT 
from infoone 
where(
    (address like '%"+txtSearch.Text+"%')  
    or 
    (locationcity like '%"+txtSearch.Text+"%')
    or
    (address + locationcity like '%"+txtSearch.Text+"%')
    or
    (address + ' ' + locationcity like '%"+txtSearch.Text+"%')
    )

如果在地址或位置城市中找到文本匹配,或者文本在组合时与其匹配,或者与空格结合,则会返回记录。

这就是为什么您没有在您提供的示例输入上获得任何结果。使用上面的代码,在搜索&#34;主要街道埃德蒙顿&#34;

时,您应该在最后的第四个条件上得到匹配

你应该首先使用SSMS中的非动态SQL,使用文本变量(例如@TEXT),一旦它根据你的文本参数返回你想要的结果,你可以将它切换动态的。将此文本写为要执行的SQL字符串只会让您在开发SQL代码时感到困惑。

要获得更广泛的解决方案,您可能需要查看全文搜索: http://msdn.microsoft.com/en-us/library/ms142571.aspx

这会将一个字符串拆分为单个单词,并搜索这些单词,它允许您提出加权猜测和匹配排名。它甚至允许你使用词库使用类似的术语,所以如果有人搜索了&#34; 123 Main St。&#34;和#34; 123 Main Street&#34;在数据库中,它会找到那些匹配。

答案 2 :(得分:0)

这种搜索非常困难,但是有很多不同的方法可以在地址中进行良好的搜索,

最简单的方法是,像这样搜索完整的地址;

从adrs WHERE(locationcity +&#39;,&#39; +地址)中选择*,例如&#39;%searchword%&#39;

但是无法知道哪个词是城市。