存储过程中的通配符

时间:2012-11-07 05:26:32

标签: sql-server stored-procedures ssms

我有一个包含表address(a_id:int, street:nvarchar(50), apt:nvarchar(50), city:nvarchar(50), state:nvarchar(50), zip:int)

的SQL Server数据库

我有一个存储过程,它返回特定地址的a_id

SELECT
    address_id
FROM
     address a
WHERE
    street like '%'+ @street +'%'
    and apt like '%'+ @apt +'%'
    and zip = @zip

例如,如果我输入1060 West Addison Street Chicago IL 60613,我希望获得与a_id1060 W Addison Street Chicago IL 60613相同的1060 W. Addison Street Chicago IL 60613

正如您所看到的,我尝试在streetapt列周围放置外卡以说明缩写和句点的差异,但它不起作用。

目前只有第一个示例返回a_id,因为这与db中的内容完全匹配

1 个答案:

答案 0 :(得分:1)

LIKE运算符无法正常工作。如果您使用LIKE %Addisson%,则会同时返回West AddisonW Addison,但如果输入为W Addison,则无法返回West Addisson

来自MSDN

% - Any string of zero or more characters. - WHERE title LIKE '%computer%' 
finds all book titles with the word 'computer' anywhere in the book title.

对于您的方案,您可能需要查看full tezxt index search,这可能会让您实现目标。具体而言,CONSTAINABLE关键字可能会帮助您:

  

使用加权值搜索单词或短语(加权期限)

     

您可以使用CONTAINSTABLE搜索单词或短语并指定   加权值。重量,以0.0到1.0之间的数字衡量,   表示一组单词中每个单词和短语的重要性   和短语。重量0.0最低,重量1.0   最高。

     

以下示例显示了搜索所有客户的查询   地址,使用权重,其中任何以字符串开头的文本   “Bay”有“Street”或“View”。结果给出了更高的排名   那些包含更多指定单词的行。

USE AdventureWorks2012 GO

SELECT AddressLine1, KEY_TBL.RANK  FROM Person.Address AS Address
INNER JOIN CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT
("Bay*", 
         Street WEIGHT(0.9), 
         View WEIGHT(0.1)
         ) ' ) AS KEY_TBL ON Address.AddressID = KEY_TBL.[KEY] ORDER BY 
KEY_TBL.RANK DESC GO
  

加权术语可以与任何简单术语一起使用,   前缀术语,生成术语或邻近术语。

来源:Query with Full-Text Search