【问题标题】:closest partial string matching in SQLSQL中最接近的部分字符串匹配
【发布时间】:2023-03-29 15:52:01
【问题描述】:

我有一个数据库表,其中包含部分邮政编码。我正在尝试编写一个查询,该查询将采用邮政编码并在表中找到与该代码尽可能接近的行。在下面的示例中,邮政编码为“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)而不是第一行和第三行

【问题讨论】:

  • 您使用的是哪个数据库服务器?

标签: sql sql-server oracle


【解决方案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。

【讨论】:

    猜你喜欢
    • 2017-03-29
    • 2011-08-17
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多