2013-06-28 42 views
0

我有包含2個屬性 - 代碼和範圍的表(T-SQL)。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」後綴代碼值和代碼值(用逗號分隔)屬性在一行。

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

什麼是最佳解決方案?也許以某種方式使用XML Path()?

+3

如果您在應用程序/報告層而不是SQL中執行此操作,則會更容易。 SQL不擅長「創建」那些不存在的數據。 –

+0

有了Powershell,我猜測很多其他語言,自從'X..X'語法自動擴展後,您可以不做任何更改。 – JNK

回答

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 
+0

非常感謝。我將使用這個解決方案。它簡單而實用。 – Rutz

-1

喜歡的東西

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

不知道關於您呈現怎麼樣的範圍內。

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 Code, dbo.GetRangeText(Range) FROM Table1 WHERE Code LIKE '%_RANGE' 

這將給除外輸出在SELECT查詢的功能。

+0

感謝您向我展示其中一種解決方案。 – Rutz

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。它可以改進以支持更大的範圍。

+0

感謝您的輸入和小提琴示例。非常感激。 – Rutz