繁体   English   中英

用like运算符的sql搜索查询

[英]sql search query with like operator

我有一个名为infoone的表, infoone有两列addresslocationCITY

我想写一个搜索查询。

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

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

我正在关注什么查询,

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

我做错了什么?

请帮忙

谢谢

自由格式搜索地址非常困难。

让我们看看你的例子

Address         locationCity
12 Main Street  Edmonton
456 Thomas Ave  St Martin

可能的搜寻

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

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

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

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

其他注意事项

用户搜索会发生什么

12 Main St

要么

爱德蒙顿

缩写? 拼写错误?

为了处理缩写,我将构建一个停用词列表,该列表将删除地址字段中的常见缩写,例如St,Street,Avenue,Ave等。因此,搜索变为

12主要

我不想错过一张唱片,因为我不确定它是桌子上的st还是Street。

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

祝好运

我不相信您的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
    )

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

至少,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+"%')
    )

如果在地址或位置城市中找到文本匹配项,或者文本在组合时或与空格组合时均与它们匹配,则将返回一条记录。

这就是为什么您没有从提供的样本输入中得到任何结果的原因。 使用上面的代码,当搜索“大街埃德蒙顿”时,您应该在最后的第四个条件上匹配

您应该首先在SSMS中使代码与非动态SQL一起使用,并为文本使用变量(例如@TEXT),然后根据文本参数返回所需的结果后,可以将其切换为动态。 将其写为要执行的SQL字符串只会使您在继续开发SQL代码时使事情复杂化。

有关更广泛的解决方案,您可能需要查看全文搜索: http : //msdn.microsoft.com/zh-cn/library/ms142571.aspx

这会将字符串分解成单个单词,然后搜索这些单词,使您可以得出加权的猜测和匹配排名。 它甚至允许您使用同义词库使用类似的术语,因此,如果有人搜索“ 123 Main St.” 而“ 123 Main Street”位于数据库中,它将找到匹配的内容。

这种搜索非常困难,但是在地址中进行搜索的方法有很多,

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

从adrs WHERE(位置城市+','+地址)中选择*,例如'%searchword%'

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM