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中最接近的部分字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章