跨多个价格范围搜索
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
我们最近将旧存储过程从动态 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