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 属性在单行上指定的代码值(用逗号分隔)。

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 回答