跨多个价格范围搜索

Search across multiple Price Ranges

我们最近将旧存储过程从动态 SQL 转换为直接 SQL。这是一个搜索引擎,我们让用户输入值字符串。

所以他们可能想要搜索多个订单号,所以他们会输入

111,222-3,444-0

我们将该字符串处理成 table 值中的行,然后将 table 连接到我们的主要订单 table 到 return 行。

问题是他们的选择之一是跨多个价格范围进行搜索。所以他们会选择发票总计选项并输入

10-25,100-125,200-300

他们要求的是 return 发票总额在 10 美元到 25 美元之间或 100 美元到 125 美元之间或 200 美元到 300 美元之间的订单。

我不知道该如何处理。当他们搜索字符串文本时,我们只是将列表解析为 FORMSOF(INFLECTIONAL 语句,我们将其传递给 FTI 的 CONTAINSTABLE 调用。

得到的任何建议
10-25,100-125,200-300

WHERE InvoiceTotal BETWEEN  10 AND  25
   OR InvoiceTotal BETWEEN 100 and 125
   OR InvoiceTotal BETWEEN 200 and 300

或者,功能相似但不使用动态的东西 SQL。

您可以结合使用交叉应用和 sql 服务器字符串拆分器功能来根据用户的条件过滤您的数据。以下示例演示了该概念:

DECLARE @filter NVARCHAR(1000) = '10-25,100-125,500,200-300';

;WITH CTE_RangeComparisons
AS
(
    -- Use string split function to get input ranges
    SELECT      [value]
                ,(
                    -- If string contain the ‘-‘ character then we know we have a high limit and low limit specified otherwise we assume a single value.
                    CASE 
                        WHEN CHARINDEX('-',[value])  > 0 THEN CAST(LEFT([value], (CHARINDEX('-',[value]) - 1)) AS FLOAT) 
                        ELSE CAST([value] AS FLOAT)
                    END
                 ) AS LowRange
                ,(
                    CASE 
                        WHEN CHARINDEX('-',[value])  > 0 THEN CAST(RIGHT([value], LEN([value]) - (CHARINDEX('-',[value]))) AS FLOAT)
                        ELSE CAST([value] AS FLOAT)
                    END
                ) AS HighRange
    FROM        string_split(@filter, ',')
)
SELECT      D.*
FROM        [YourDataTable] D
CROSS APPLY (
                -- Use cross apply to filter data on the ranges identified.
                SELECT  1 [Match] -- Selected values here does not matter we are only interested in filtering the parent table.
                FROM    CTE_RangeComparisons R
                WHERE   D.InvoiceTotal >= R.LowRange AND D.InvoiceTotal <= R.HighRange
            ) Ranges