2013-06-28 1 views
0

코드 및 범위라는 두 가지 특성이있는 테이블 (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()를 사용하여 어쩌면? 당신이 좋아하는 방법 범위를 제시 확실하지

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

같은

+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의 메소드입니다.

+0

고마워. 나는이 해결책을 사용할 것이다. 그것은 간단하고 기능적입니다. – Rutz

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