我在 mssql 数据库中工作。我有以下情况,
我在行中有值
2-5,10-12,67-89....
我需要一个 sql 查询来仅获取至少一个包含用户输入范围的行。
例如,如果用户输入是 4,那么应该至少有一个范围包含 4,例如 (1-5)。
是否可以通过单个查询来实现相同的目标。
我在 mssql 数据库中工作。我有以下情况,
我在行中有值
2-5,10-12,67-89....
我需要一个 sql 查询来仅获取至少一个包含用户输入范围的行。
例如,如果用户输入是 4,那么应该至少有一个范围包含 4,例如 (1-5)。
是否可以通过单个查询来实现相同的目标。
试试这个:
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";
如果这些范围存储为单个 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";