SQL-搜索“地址”(其中包含字符串参数)

时间:2019-06-14 05:25:47

标签: sql sql-server

我有一个存储过程,可以找到特定的地址。

字段

  • 城市
  • 邮政编码

记录

  • 城市:马尼拉,马卡蒂,宿雾市,卡威特
  • 省:NCR,NCR,CEBU,CAVITE
  • 邮政编码:1111,2222,3333,4444

我的参数仅接受1个完整字符串

示例:

Declare @param as nvarchar (50)
SET @param = 'Man NC'
--query where condition like @param

结果应为马尼拉,NCR 111 。我已经尝试过此查询。但是显然不正确,因为参数包含城市和省份。

SELECT c.CityName, p.ProvinceName, c.Zipcode 
FROM City c (NOLOCK)
JOIN Province p (NOLOCK) ON c.ProvinceCode = p.ProvinceCode
WHERE c.CityName like '%' + @param + '%' 
OR p.ProvinceName like '%' + @param + '%' 
OR (c.CityName + ' ' + p.ProvinceName) like '%' + @param + '%'

我在stackoverflow上看到过一些建议使用全文搜索的文章。但是如何在不使用上述功能的情况下做到这一点?

2 个答案:

答案 0 :(得分:1)

在您喜欢它们之前,可以将它们串联起来。您还可以编辑自己喜欢的字符串:

SELECT c.CityName, p.ProvinceName, c.Zipcode 
FROM City c (NOLOCK)
JOIN Province p (NOLOCK) ON c.ProvinceCode = p.ProvinceCode
WHERE CONCAT(c.CityName, ",", p.ProvinceName) like CONCAT('%', REPLACE(@param, ' ', '%'), '%')

在这里我将城市和省份联系在一起,然后将您的“ Man NC”转换为“%Man%NC%”,这将找到连接的值

如果您要以“ NC Man”之类的形式提供查询,则可以简单地将ORCAT与CONCAT串联起来,然后将省份与城市相连。您可能会更多地参与其中,拆分价值等;这实际上取决于您指定的内容(并且您没有在问题中添加很多规范)

如果您要进行很多查询,最好确定@param的变体并设置一些规则,以便可以更好地建立索引。规则示例可能是:@param必须是一个单词或两个单词,并且这些单词必须代表城市名称或省名或城市名称与省名的开头。

使用类似的规则,您可以在空间上拆分,将%匹配到单词的末尾,然后适当地搜索列-可能使用并集而不是or或(可以更快)

编辑:不带CONCAT功能的版本

WHERE (c.CityName + "," + p.ProvinceName) like ('%' + REPLACE(@param, ' ', '%') + '%')

答案 1 :(得分:0)

我不确定这是否是您想要的。

Declare @city table (city varchar(50))

insert into @city values ('Manila'),('Makati'),('Cebu City'),('Kawit')

Declare @province table (Province varchar(50),zip int)

insert into @province values ('NCR',1111),('NCR',2222),('CEBU',3333),('CAVITE','4444')

select top 1 city + ', ' + Province + cast(zip as varchar) as name from @city c cross join @province d  where city like 'Man%' and Province like 'NC%'