簡體   English   中英

如何使用Regex表達式匹配寬度和高度大小,以及如何在SQL或C#中使用“排序依據”來構建下拉列表?

[英]How to match a width and height size with a Regex expression and use Sort By in SQL or C# to build a drop-down?

我有一個SQL查詢,它將檢索下表,但我想在下拉選擇中以降序(從小到大)正確地排列板子的大小。 我正在使用C#從對象構建Dropdown選擇。

這是當前SQL查詢返回的內容。

在此處輸入圖片說明

DECLARE @StockID int = 680

DECLARE @VariationParent int = (SELECT TOP 1 StockParent_ParentId FROM 
StockVariations SV INNER JOIN FinGoodsParent FGP ON FGP.Id = 
SV.StockParent_ChildId WHERE StockParent_ChildId = @StockID AND SV.IsDeleted = 0 
AND FGP.IsDeleted = 0 AND FGP.Publish = 1) 


 SELECT DISTINCT AV.ID, AV.AttrValue, AV.AttributeTypes_Id 'AttributeTypeID', CAST(CASE WHEN SA.StockParent_Id = @StockID THEN 1 ELSE 0 END as BIT) 'IsDefault' 
   FROM AttributeTypes AT 
  INNER JOIN AttributeValues AV ON AV.AttributeTypes_Id = AT.Id 
  INNER JOIN StockParent_AttributeValues SA on SA.AttributeValue_Id = AV.Id 
  INNER JOIN FinGoodsParent FGP ON FGP.Id = SA.StockParent_Id AND FGP.IsDeleted = 0 AND FGP.Publish = 1
  WHERE SA.StockParent_Id IN (SELECT SV.StockParent_ChildId FROM StockVariations SV INNER JOIN FinGoodsParent FGP ON FGP.Id = SV.StockParent_ChildId AND FGP.IsDeleted = 0 AND FGP.Publish = 1 WHERE SV.StockParent_ParentId = @VariationParent AND SV.IsDeleted = 0) 
  AND SA.IsDeleted = 0 AND AT.IsDeleted = 0 AND AV.IsDeleted = 0
  ORDER BY AV.AttrValue DESC

我嘗試使用有效的JQuery代碼,但它替換了下拉選擇的值,這將阻止我的Ajax函數檢索正確的信息。

這是可以工作的JQuery代碼,但是我想用SQLC#進行 下面的代碼將對帶有數字的任何內容進行正則表達式匹配,並去除第一個數字並比較大小。 必須注意的是,有時數據庫中的大小可以用x而不是*來分隔值。

<select class="variation-picker">   
    <option value="42">1500*900</option>
    <option value="48">900*900</option>
    <option value="46">2400*600</option>
    <option value="49">600*600</option>
</select>

$( document ).ready(function() {
    $(".variation-picker").html($(".variation-picker option").val(function () {
        return this.text.match(/\d+/);
    }).sort(function (a, b) {
        var a = parseInt(a.value, 10), b = parseInt(b.value, 10);
        return a < b ? -1 : 1;
     }));

    $('.variation-picker').find('option[selected="selected"]').each(function () {
        $(this).prop('selected', true);
    });

});

這是我用來構建變體選擇下拉列表的C#代碼。 AttrValue列還可以包含值,如colourmeters ,所以它不應該僅僅依賴於數值。 我真的不想創建帶有訂單優先級等的單獨表格。

if (ProductDetails.ProductVariations?.Count > 0)
        {
            var html = new System.Text.StringBuilder();
            var colCount = 0;

            //Build the variations dropdowns

            ProductDetails.ProductVariations.ForEach(p =>
            {
                if (colCount == 2)
                {
                    colCount = 0;
                    html.AppendLine("</div>");
                    html.AppendLine("<div class='row'>");
                }

                html.AppendLine("<div class='col-md-6 single-variation-div'>");
                html.AppendLine($"<span class='text_select' id='v_{p.ID}'>{p.Name}</span><br />");
                html.AppendLine("<select class='selectpicker variation-picker' data-width='300px' onchange='javascript:ChangeProductVariance();'> ");
                p.ProdVariationValues.ForEach(v => html.AppendLine($"<option value='{v.ID}' { (v.IsDefault ? "selected='selected'" : "") }>{v.AttrValue}</option>"));
                html.AppendLine("</select><br/>");
                html.AppendLine("</div>");

                colCount++;
            });

            ProductVarienceHTML = html.ToString();
        }
        else
        {
            ProductVarienceHTML = "";
        }

我建議您通過以下方法從表結構中解決該問題:通過添加具有(INT)數據類型的高度和寬度的列,然后按(height * width)進行排序

最好的解決方案和最快的解決方案是@Ahmad Alkaraki所說的。

如果您不能這樣做,那么這是一個可行的解決方案。 SPLIT AttrValue並將其轉換為int,然后extext widthheight ,然后提取size

看看order by

我不確定在您的mssql中func LAST EXIST是否存在,但是您知道了

 SELECT DISTINCT AV.ID, AV.AttrValue, AV.AttributeTypes_Id 'AttributeTypeID', CAST(CASE WHEN SA.StockParent_Id = @StockID THEN 1 ELSE 0 END as BIT) 'IsDefault',

   FROM AttributeTypes AT 
  INNER JOIN AttributeValues AV ON AV.AttributeTypes_Id = AT.Id 
  INNER JOIN StockParent_AttributeValues SA on SA.AttributeValue_Id = AV.Id 
  INNER JOIN FinGoodsParent FGP ON FGP.Id = SA.StockParent_Id AND FGP.IsDeleted = 0 AND FGP.Publish = 1
  WHERE SA.StockParent_Id IN (SELECT SV.StockParent_ChildId FROM StockVariations SV INNER JOIN FinGoodsParent FGP ON FGP.Id = SV.StockParent_ChildId AND FGP.IsDeleted = 0 AND FGP.Publish = 1 WHERE SV.StockParent_ParentId = @VariationParent AND SV.IsDeleted = 0) 
  AND SA.IsDeleted = 0 AND AT.IsDeleted = 0 AND AV.IsDeleted = 0
  ORDER BY ((SELECT top 1 cast(value as int) FROM STRING_SPLIT(AT.AttrValue, "*") *
            (SELECT cast(LAST(value)) FROM STRING_SPLIT(AT.AttrValue, "*")) DESC

萬一您不能通過添加heightwidth列來更改數據庫架構,以防萬一:

假設這是您的模式,只是為了簡化您的原始查詢:

CREATE TABLE attributes
    ([AttrValue] varchar(13))
;

INSERT INTO attributes
    ([AttrValue])
VALUES
    ('900*900mm'),
    ('1200*900mm'),
    ('1200*1200mm')
;

讓我們創建一個按height * width降序排序的查詢:

SELECT
  attrValue,
  CONVERT(int, (select top 1 value from STRING_SPLIT(attrValue, '*'))) as [leftAttrValue],
  CONVERT(int, (select top 1 LEFT(value, LEN(value) - 2) from STRING_SPLIT(attrValue, '*') where value LIKE '%mm')) as [rightAttrValue]
FROM
  attributes
ORDER BY 
    CONVERT(int, (select top 1 value from STRING_SPLIT(attrValue, '*'))) * 
    CONVERT(int, (select top 1 LEFT(value, LEN(value) - 2) from STRING_SPLIT(attrValue, '*') where value LIKE '%mm'))  DESC
  ;

該查詢的結果是這樣的:

|   attrValue | leftAttrValue | rightAttrValue |
|-------------|---------------|----------------|
| 1200*1200mm |          1200 |           1200 |
|  1200*900mm |          1200 |            900 |
|   900*900mm |           900 |            900 |

您可以在以下SQL Server小提琴中對此進行測試: http ://sqlfiddle.com/#!18/ 691b3/11

因此,我們現在將對此進行調整以解決您的問題:

SELECT DISTINCT AV.ID, AV.AttrValue, AV.AttributeTypes_Id 'AttributeTypeID', CAST(CASE WHEN SA.StockParent_Id = @StockID THEN 1 ELSE 0 END as BIT) 'IsDefault' 
   FROM AttributeTypes AT 
  INNER JOIN AttributeValues AV ON AV.AttributeTypes_Id = AT.Id 
  INNER JOIN StockParent_AttributeValues SA on SA.AttributeValue_Id = AV.Id 
  INNER JOIN FinGoodsParent FGP ON FGP.Id = SA.StockParent_Id AND FGP.IsDeleted = 0 AND FGP.Publish = 1
  WHERE SA.StockParent_Id IN (SELECT SV.StockParent_ChildId FROM StockVariations SV INNER JOIN FinGoodsParent FGP ON FGP.Id = SV.StockParent_ChildId AND FGP.IsDeleted = 0 AND FGP.Publish = 1 WHERE SV.StockParent_ParentId = @VariationParent AND SV.IsDeleted = 0) 
  AND SA.IsDeleted = 0 AND AT.IsDeleted = 0 AND AV.IsDeleted = 0
  ORDER BY 
      CONVERT(int, (select top 1 value from STRING_SPLIT(AV.AttrValue, '*'))) * 
      CONVERT(int, (select top 1 LEFT(value, LEN(value) - 2) from STRING_SPLIT(AV.AttrValue, '*') where value LIKE '%mm'))  
    DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM