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

时间:2016-10-03 13:43:24

标签: php sql sql-server

我继承了一个使用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%');

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

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

我试过这个,但它没有我希望的效果:

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

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

是否有一种有效的方法:

  1. 搜索以给定字符串开头的varchar
  2. 根据该字符串的接近度,然后按值
  3. 订购结果

    预期结果:

    参数:

    $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 |
    -------------------------------------------------------------------------------------
    

1 个答案:

答案 0 :(得分: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;

我希望它有所帮助。

相关问题