2016-10-03 80 views
2

PHPスクリプトを使用してSQL Server 2012データベースにアクセスするプロジェクトを継承しました。アプリケーションでは、ユーザーが複数のパラメーターを入力し、それらのパラメーターに基づいて要求を行うことができます。英数字の文字列で類似性をソートMS 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 

を私もファジー文字列マッチングにいくつかの読書を行ってきたが、私はここでそれを実装するかどうかはわかりません。

に効果的な方法があります:、その後、値

によって検索結果を期待その文字列の近さに基づいて、指定された文字列で

  • 注文結果を開始VARCHARため

    1. 検索:

      パラメータ:

      $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 | 
      ------------------------------------------------------------------------------------- 
      
  • +0

    期待した結果と実際の結果を表示してください。 – TheGameiswar

    +0

    また、 '$ localSKU'のいくつかの例がありますか? – scsimon

    +0

    @TheGameiswar私はあなたのためにそれらを追加しました。私はさらに明確にすることができるかどうか教えてください –

    答えて

    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; 
    

    私はそれが役に立てば幸い。

    +0

    の生産データベースから引き出されました。少し調整しても良い結果が得られました。 ORDER BY MyOrder ASC、IB.LocalSKU ASC; –

    +0

    私はそれがうまくいった:) –

    関連する問題