按字母数字字符串 MS SQL Server 2012 中的相似性排序

Posted

技术标签:

【中文标题】按字母数字字符串 MS SQL Server 2012 中的相似性排序【英文标题】:Sorting by similarity in alphanumeric string MS SQL Server 2012 【发布时间】:2016-10-03 13:43:24 【问题描述】:

我继承了一个使用 php 脚本访问 SQL Server 2012 数据库的项目。该应用程序允许用户输入多个参数并根据这些参数发出请求。

我遇到的问题是一个允许用户搜索 SKU 以字母数字字符串开头的项目的字段。

这是项目使用的查询:

SELECT top 10 IB.LocalSKU
, Cast(Round(IB.GoalMargin, 2) AS Decimal(10,2)) AS GoalMargin
, CASE WHEN IB.MAP = 0 THEN NULL ELSE IB.MAP END AS Min
, IB.ProductCost
, IB.ShippingEstimate
, EB.Price AS CurrentPrice


FROM intra.InventoryBase IB INNER JOIN intra.DropshipChannelAdvisorSKUs CA
  ON IB.LocalSKU = CA.LocalSKU
LEFT JOIN intra.eBayQoHFeedback EB
  ON CA.ChannelAdvisorSKU = EB.SKU

WHERE LOWER(IB.LocalSKU) LIKE LOWER('$localSKU%')
  AND LOWER(SupplierID) LIKE LOWER('%$supplierId%')
  AND LOWER(IB.Category) LIKE LOWER('%$category%')
  AND LOWER(IB.Dropship) LIKE LOWER('%$dropship%');

我注意到查询返回了正确的信息,但没有按照有用的顺序。

我不确定如何对其进行排序,以便 SKU 与 $localSKU 变量最匹配的行排在第一位。

我尝试了这个,但没有达到我希望的效果:

ORDER BY Difference(IB.LocalSKU, '$localSKU%') ASC

我也读过一些关于模糊字符串匹配的文章,但我不知道如何在这里实现它。

有没有有效的方法:

    搜索以给定字符串开头的 varchar 根据该字符串的接近程度对结果进行排序,然后按值排序

预期结果:

参数:

$localSKU = "FMCPL1CY00"; 
$supplierId = 87; 
$category = "Premium Floor Liners"; 
$dropship = True;

预期结果:

--------------------------------------------------------------------------------
| FMCPL1CY00* | GoalMargin | 0 | ProductCost | ShippingEstimate | CurrentPrice |
| FMCPL1CY01* | GoalMargin | 0 | ProductCost | ShippingEstimate | CurrentPrice |
| FMCPL1CY02* | GoalMargin | 0 | ProductCost | ShippingEstimate | CurrentPrice |
| FMCPL1CY03* | GoalMargin | 0 | ProductCost | ShippingEstimate | CurrentPrice |
--------------------------------------------------------------------------------

实际结果:

-------------------------------------------------------------------------------------
| FMCPL1CH04221509 | GoalMargin | 0 | ProductCost | ShippingEstimate | CurrentPrice |
| FMCPM1SA0021302  | GoalMargin | 0 | ProductCost | ShippingEstimate | CurrentPrice |
| FMCPL1TY07801509 | GoalMargin | 0 | ProductCost | ShippingEstimate | CurrentPrice |
| FMCPL1TY05721502 | GoalMargin | 0 | ProductCost | ShippingEstimate | CurrentPrice |
-------------------------------------------------------------------------------------

【问题讨论】:

能否请您显示预期结果和实际结果 另外,你能提供一些$localSKU的例子吗? @TheGameiswar 我为你添加了这些,如果我能进一步澄清,请告诉我 @scsimon 完成,如果还有什么我可以添加的,请告诉我 所以我们可以删除前 8 个符号并通过将字符串转换为 int 来排序? 【参考方案1】:

试试这个查询:

SELECT top 10 IB.LocalSKU
, Cast(Round(IB.GoalMargin, 2) AS Decimal(10,2)) AS GoalMargin
, CASE WHEN IB.MAP = 0 THEN NULL ELSE IB.MAP END AS Min
, IB.ProductCost
, IB.ShippingEstimate
, EB.Price AS CurrentPrice

,CASE WHEN IB.LocalSKU LIKE '$localSKU%' THEN 0  else 1 END as MyOrder

FROM intra.InventoryBase IB INNER JOIN intra.DropshipChannelAdvisorSKUs CA
  ON IB.LocalSKU = CA.LocalSKU
LEFT JOIN intra.eBayQoHFeedback EB
  ON CA.ChannelAdvisorSKU = EB.SKU

WHERE LOWER(IB.LocalSKU) LIKE LOWER('$localSKU%')
  AND LOWER(SupplierID) LIKE LOWER('%$supplierId%')
  AND LOWER(IB.Category) LIKE LOWER('%$category%')
  AND LOWER(IB.Dropship) LIKE LOWER('%$dropship%')

ORDER BY MyOrder ASC;

我希望它有所帮助。

【讨论】:

这给了我一个很好的结果,稍微调整一下:ORDER BY MyOrder ASC, IB.LocalSKU ASC;

以上是关于按字母数字字符串 MS SQL Server 2012 中的相似性排序的主要内容,如果未能解决你的问题,请参考以下文章

sql server 按字母顺序排序,然后是数字

SQLserver排序问题,字段中含有字母、数字、汉字,如何只按数字排序

sql server 怎么使一列实现字母+数字,该数字为自动增长的形式

SQL Server:如何从字符串中删除前导/尾随非字母数字字符?

MS Access 2003 - 排序列表框的字符串值不是按字母顺序

SQL Server存储过程 - 返回包含字母数字结果的3个字符行号的逻辑