[英]sql search query with like operator
我有一个名为infoone
的表, infoone
有两列address
和locationCITY
。
我想写一个搜索查询。
如果用户搜索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
我做错了什么?
请帮忙
谢谢
自由格式搜索地址非常困难。
让我们看看你的例子
Address locationCity
12 Main Street Edmonton
456 Thomas Ave St Martin
可能的搜寻
我建议您的界面接受两列,一列用于地址,一列用于城市,这将使搜索更加容易。
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.