【问题标题】:Wild Cards in a stored procedure存储过程中的通配符
【发布时间】:2012-11-07 05:26:32
【问题描述】:

我有一个 SQL Server 数据库,其中包含一个表 address(a_id:int, street:nvarchar(50), apt:nvarchar(50), city:nvarchar(50), state:nvarchar(50), zip:int)

我有一个存储过程,它返回特定地址的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,我希望得到与1060 W Addison Street Chicago IL 606131060 W. Addison Street Chicago IL 60613 相同的a_id

如您所见,我尝试在 streetapt 列周围放置通配符以说明缩写和句点的差异,但它不起作用。

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

【问题讨论】:

    标签: sql-server stored-procedures ssms


    【解决方案1】:

    LIKE 运算符不会像您希望的那样工作。如果使用LIKE %Addisson%,它将返回West AddisonW Addison,但如果输入为West Addisson,则不能返回W Addison

    来自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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多