我有一个存储过程,可以找到特定的地址。
字段
记录
我的参数仅接受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上看到过一些建议使用全文搜索的文章。但是如何在不使用上述功能的情况下做到这一点?
答案 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%'