2

私はmssqlデータベースで働いています。私は次のシナリオを持っています、

行に次のような値があります

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

ユーザー入力を含む範囲が少なくとも1つある行のみをフェッチするには、SQLクエリが必要です。

たとえば、ユーザー入力が4の場合、(1-5)のように4を含む範囲が少なくとも1つあるはずです。

単一のクエリで同じことを達成することは可能ですか?

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 に答える