2

我在 mssql 数据库中工作。我有以下情况,

我在行中有值

2-5,10-12,67-89....

我需要一个 sql 查询来仅获取至少一个包含用户输入范围的行。

例如,如果用户输入是 4,那么应该至少有一个范围包含 4,例如 (1-5)。

是否可以通过单个查询来实现相同的目标。

4

1 回答 1

3

试试这个:

DECLARE @numberToFind INT = 4;
;WITH CTE
AS
(
    SELECT 
      arange,
      SUBSTRING(arange, 1, CHARINDEX('-', arange,1) - 1) "From",
      SUBSTRING(arange, 
                CHARINDEX('-', arange,1) + 1, 
                          LEN(arange) - CHARINDEX('-', arange,1) + 1) "To"
    FROM @ranges
) 
SELECT arange
FROM CTE
WHERE @numberToFind BETWEEN "From" AND "To";

SQL 小提琴演示

如果这些范围存储为单个 varchar 字符串,那么您必须首先解析这些逗号分隔的范围,如下所示:

DECLARE @ranges VARCHAR(100) = ('2-5,10-12,67-89');
declare @numberToFind INT = 4;

DECLARE @Xml xml =  CONVERT(xml,
                            '<root><s>' + 
                            REPLACE(@ranges, ',', '</s><s>') + 
                            '</s></root>');

;WITH ParsedRanges
AS
(
    SELECT arange = T.c.value('.','varchar(20)')
    FROM @Xml.nodes('/root/s') T(c)
), CTE
AS
(
    SELECT 
      arange,
      SUBSTRING(arange, 1, CHARINDEX('-', arange,1) - 1) "From",
      SUBSTRING(arange, 
                CHARINDEX('-', arange,1) + 1, 
                LEN(arange) - CHARINDEX('-', arange,1) + 1) "To"
    FROM ParsedRanges
) 
SELECT arange
FROM CTE
WHERE @numberToFind BETWEEN "From" AND "To";

SQL 小提琴演示

于 2012-12-04T06:59:07.383 回答