0

コードと範囲の 2 つの属性を持つテーブル (T-SQL) があります。

Code                 Range
-------------------- ----------
5000_RANGE           5001..5003
5001                 NULL
5002                 NULL
5003                 NULL
5802                 NULL
5802_RANGE           5802..5804
5803                 NULL
5804                 NULL
6401                 NULL

「_RANGE」接尾辞を含むコード値と、Range 属性で指定されたコード値 (カンマ区切り) を 1 行で取得する簡単なクエリを作成しようとしています。

Code                 Range
-------------------- --------------
5000_RANGE           5001,5002,5003
5802_RANGE           5802,5803,5804

最善の解決策は何ですか?XML Path() を使用してどうにかして?

4

4 に答える 4

1

自己結合を使用してリストを取得できます。

select range.code, c.code
from (select code, range
      from t
      where code like '%RANGE'
     ) range left outer join
     (select t.*
      from t
      where code not like '%RANGE'
     ) c
     on c.code between left(range.range, 4) and right(range.range, 4)

それらをカンマ区切りのリストに入れるかどうかは、データベースによって異なります。MySQL のメソッドは次のとおりです。

select range.code, group_concat(c.code)
from (select code, range
      from t
      where code like '%RANGE'
     ) range left outer join
     (select t.*
      from t
      where code not like '%RANGE'
     ) c
     on c.code between left(range.range, 4) and right(range.range, 4)
group by range.code
于 2013-06-28T13:32:18.930 に答える
0

これを試して。以下のような関数を作成します。

ALTER FUNCTION GetRangeText
(
    @Value VARCHAR(50)
) RETURNS VARCHAR(100)
AS
BEGIN
    DECLARE @Start AS INT
    DECLARE @End AS INT
    DECLARE @RangeText AS VARCHAR(200)
    SET @RangeText = ''

    SET @Start = CAST(SUBSTRING(@Value, 0, CHARINDEX('...', @Value)) AS INT)
    SET @End = CAST(SUBSTRING(@Value, CHARINDEX('...', @Value) + 3, LEN(@Value)) AS INT)

    WHILE @Start <= @End
    BEGIN       
        SET @RangeText = @RangeText + CAST(@Start AS VARCHAR(100)) + ','

        SET @Start = @Start + 1
    END

    RETURN @RangeText
END

以下のように SELECT クエリで関数を使用します

SELECT Code, dbo.GetRangeText(Range) FROM Table1 WHERE Code LIKE '%_RANGE'

これにより、例外出力が得られます。

于 2013-06-28T13:54:28.457 に答える
0

使用している DBMS を指定していません。MySQL を使用している場合は、次のようなクエリを使用できます。

SELECT
  Code,
  GROUP_CONCAT(SUBSTRING_INDEX(rng, '..', 1)+numbers.digit) ranges
FROM
  (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
   SELECT 4 UNION ALL SELECT 4 UNION ALL SELECT 5) numbers
  INNER JOIN
  codes
  ON SUBSTRING_INDEX(rng, '..', -1)-SUBSTRING_INDEX(rng, '..', 1)>=numbers.digit
WHERE
  rng like '%..%'
GROUP BY
  Code

これにより、必要な結果が正確に得られます。

ここでフィドルを参照してください。より広い範囲をサポートするように改善できます。

于 2013-06-28T14:05:48.253 に答える
-1

何かのようなもの

SELECT Code, Range FROM code_table WHERE Code LIKE "%_RANGE"

あなたが好きなように範囲を提示することについて確信が持てません。

于 2013-06-28T13:32:17.640 に答える