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

Posted

技术标签:

【中文标题】SQL中最接近的部分字符串匹配【英文标题】:closest partial string matching in SQL 【发布时间】:2011-06-14 12:34:44 【问题描述】:

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

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)而不是第一行和第三行

【问题讨论】:

您使用的是哪个数据库服务器? 【参考方案1】:

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 

甲骨文

(我现在无法测试:)

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

【讨论】:

我没有尝试过 oracle 版本,但是 SQL server 版本返回多行而没有前 1 行。就我而言,如果我有包含 Gold A 和 Gold A1A 的行,查询 Gold A1AB 会返回两者行。我只想返回最好的匹配。在这种情况下,A1A。我已经更新了问题以反映这一点 @Chris:嗯,这就是我添加SELECT TOP (1)的原因。这样可以确保只返回最佳(并且只有 1 个)匹配项。 哎呀。我的错。我将 SUBSTR 位粘贴到现有查询中并错过了 ORDER BY 子句【参考方案2】:

您只需编写如下条件:

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。

【讨论】:

以上是关于SQL中最接近的部分字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

匹配openCV中最接近的图像?

R - 根据第二个数据框中最接近的匹配分配列值

如何匹配具有多个相似字符串的字符串以找到最接近的匹配项[关闭]

SQL LEFT JOIN 与部分字符串匹配

获取最接近的字符串匹配

Access 2010 SQL 查询仅在全字字符串中查找部分匹配