我有一个名为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
我做错了什么?
请帮忙
由于
答案 0 :(得分:2)
自由搜索地址非常困难。
让我们看看你的例子
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
或
<强> 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;
但是无法知道哪个词是城市。