我有表(T-SQL),有2个属性 - 代码和范围。
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'后缀的Code值以及Range属性在一行上指定的Code值(用逗号分隔)。
Code Range
-------------------- --------------
5000_RANGE 5001,5002,5003
5802_RANGE 5802,5803,5804
什么是最佳解决方案?也许通过使用XML Path()?
答案 0 :(得分: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
答案 1 :(得分: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'
这将提供例外输出。
答案 2 :(得分: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
这可以很好地提供您需要的结果。
请参阅小提琴here。它可以改进以支持更大的范围。
答案 3 :(得分:-1)
像
这样的东西SELECT Code, Range FROM code_table WHERE Code LIKE "%_RANGE"
不确定如何展示您喜欢的范围。