SQL中最接近的部分字符串匹配

时间:2011-06-14 12:34:44

标签: sql sql-server oracle

我有一个数据库表,其中包含部分邮政编码。我正在尝试编写一个查询,该查询将采用邮政编码,并在表中找到与该代码匹配的行尽可能接近。在下面的示例中,邮政编码为“A1A B2E”的Gold客户将匹配第一行,而具有相同邮政编码的青铜客户将匹配第三行

CUST_TYPE | POST_CODE | SHIPPING_SURCHARGE
------------------------------------------
Gold      | A1A       | 0.99
Gold      | A2A       | 1.01
Gold      | A         | 3.00
Bronze    | A         | 1.05
Silver    | A         | 1.02
Bronze    | B         | 1.07

在所有情况下,查询都将通过CUST_TYPE和POST_CODE列进行查询。我希望查询只返回包含与邮政编码最匹配的一行的单行。所以,如果我查询Gold和'A1AB2B',我希望第一行(Gold,A1A,0.99)不返回第一行和第三行

2 个答案:

答案 0 :(得分:7)

<强> SQL-服务器

SELECT TOP (1) 
    *
FROM yourTable     
WHERE CUST_TYPE = @cust_type
  AND POST_CODE = LEFT( @postal_code, LEN(POST_CODE) ) 
ORDER BY LEN(POST_CODE) DESC 

<强>的Oracle

(我现在无法测试:)

SELECT 
    *
FROM 
  ( SELECT 
        *
    FROM yourTable     
    WHERE CUST_TYPE = @cust_type
      AND POST_CODE = SUBSTR( @postal_code, 1, LENGTH(POST_CODE) ) 
    ORDER BY LENGTH(POST_CODE) DESC 
  )
WHERE rownum = 1

答案 1 :(得分:0)

您只需按以下方式编写条件:

SELECT * FROM YOUR_TABLE     
WHERE CUST_TYPE = Variable_with_cust_type AND 
Variable_with_postal_code like '%'||POST_CODE||'%'

您只需在字段POST_CODE的开头和结尾处连接'%',然后使用like运算符。

我假设您正在使用ORACLE PL / SQL。